diff --git a/docs/src/main/asciidoc/transaction-guide.adoc b/docs/src/main/asciidoc/transaction-guide.adoc index 2467cecfd423d2..4f237a4a376f56 100644 --- a/docs/src/main/asciidoc/transaction-guide.adoc +++ b/docs/src/main/asciidoc/transaction-guide.adoc @@ -186,6 +186,22 @@ include::duration-format-note.adoc[] The default value is 60 seconds. +== Configuring transaction node name identifier + +Narayana, as the underlaying transaction manager, has an concept of unique node identifier. +This is important if you consider to use XA transactions with involve multiple resources. + +The node name identifier plays a crucial part in the identification of a transaction. +The node name identifier is forged into the transaction id when the transaction is created. +Based on the node name identifier the transaction manager is capable to recognized the XA tranaction +counterparts created in database or JMS broker. The identifier makes possible for the transaction manager +to roll-back the transaction counterparts during recovery. + +The node name identifier needs to be unique per transaction manager deployment. +And the node identifier needs to be stable over the transaction manager restarts. + +The node name identifier may be configured via the property `quarkus.transaction-manager.node-name`. + == Why always having a transaction manager? Does it work everywhere I want to?:: @@ -225,4 +241,3 @@ It's not a mess in Quarkus :) Resource-level was introduced to support JPA in a non managed environment. But Quarkus is both lean and a managed environment so we can safely always assume we are in JTA mode. The end result is that the difficulties of running Hibernate ORM + CDI + a transaction manager in Java SE mode are solved by Quarkus. - diff --git a/extensions/narayana-jta/runtime/src/main/java/io/quarkus/narayana/jta/runtime/NarayanaJtaRecorder.java b/extensions/narayana-jta/runtime/src/main/java/io/quarkus/narayana/jta/runtime/NarayanaJtaRecorder.java index 793b0ec7fac637..a15113fafcc3a0 100644 --- a/extensions/narayana-jta/runtime/src/main/java/io/quarkus/narayana/jta/runtime/NarayanaJtaRecorder.java +++ b/extensions/narayana-jta/runtime/src/main/java/io/quarkus/narayana/jta/runtime/NarayanaJtaRecorder.java @@ -1,8 +1,10 @@ package io.quarkus.narayana.jta.runtime; import java.lang.reflect.Field; +import java.util.Collections; import java.util.Properties; +import com.arjuna.ats.jta.common.jtaPropertyManager; import org.jboss.logging.Logger; import com.arjuna.ats.arjuna.common.CoreEnvironmentBeanException; @@ -23,7 +25,8 @@ public void setNodeName(final TransactionManagerConfiguration transactions) { try { arjPropertyManager.getCoreEnvironmentBean().setNodeIdentifier(transactions.nodeName); - TxControl.setXANodeName(transactions.xaNodeName.orElse(transactions.nodeName)); + jtaPropertyManager.getJTAEnvironmentBean().setXaRecoveryNodes(Collections.singletonList(transactions.nodeName)); + TxControl.setXANodeName(transactions.nodeName); } catch (CoreEnvironmentBeanException e) { e.printStackTrace(); } @@ -46,6 +49,7 @@ public void setDefaultProperties(Properties properties) { public void setDefaultTimeout(TransactionManagerConfiguration transactions) { transactions.defaultTransactionTimeout.ifPresent(defaultTimeout -> { + arjPropertyManager.getCoordinatorEnvironmentBean().setDefaultTimeout((int) defaultTimeout.getSeconds()); TxControl.setDefaultTimeout((int) defaultTimeout.getSeconds()); }); } diff --git a/extensions/narayana-jta/runtime/src/main/java/io/quarkus/narayana/jta/runtime/TransactionManagerConfiguration.java b/extensions/narayana-jta/runtime/src/main/java/io/quarkus/narayana/jta/runtime/TransactionManagerConfiguration.java index 75a0fbd5c81caa..28953f20b70807 100644 --- a/extensions/narayana-jta/runtime/src/main/java/io/quarkus/narayana/jta/runtime/TransactionManagerConfiguration.java +++ b/extensions/narayana-jta/runtime/src/main/java/io/quarkus/narayana/jta/runtime/TransactionManagerConfiguration.java @@ -18,12 +18,6 @@ public final class TransactionManagerConfiguration { @ConfigItem(defaultValue = "quarkus") public String nodeName; - /** - * The XA node name used by the transaction manager - */ - @ConfigItem() - public Optional xaNodeName; - /** * The default transaction timeout */