JTA による分散トランザクション
Spring Boot は、JNDI から取得したトランザクションマネージャーを使用して、複数の XA リソースに分散された JTA トランザクションをサポートします。
JTA 環境が検出されると、Spring の JtaTransactionManager
を使用してトランザクションが管理されます。自動構成された JMS、DataSource、JPA Bean は、XA トランザクションをサポートするためにアップグレードされます。@Transactional
などの標準的な Spring イディオムを使用して、分散トランザクションに参加できます。JTA 環境内でローカルトランザクションを使用する場合は、spring.jta.enabled
プロパティを false
に設定して、JTA 自動構成を無効にすることができます。
Jakarta EE Managed Transaction Manager を使用する
Spring Boot アプリケーションを war
または ear
ファイルとしてパッケージ化し、それを Jakarta EE アプリケーションサーバーにデプロイする場合は、アプリケーションサーバーの組み込みのトランザクションマネージャーを使用できます。Spring Boot は、一般的な JNDI ロケーション(java:comp/UserTransaction
、java:comp/TransactionManager
など)を調べて、トランザクションマネージャーを自動構成しようとします。アプリケーションサーバーが提供するトランザクションサービスを使用する場合は、通常、すべてのリソースがサーバーによって管理され、JNDI を介して公開されるようにする必要があります。Spring Boot は、JNDI パス(java:/JmsXA
または java:/XAConnectionFactory
)で ConnectionFactory
を探すことによって JMS を自動構成しようとします。また、spring.datasource.jndi-name
プロパティを使用して DataSource
を構成できます。
XA と非 XA JMS 接続の混在
JTA を使用する場合、プライマリ JMS ConnectionFactory
Bean は XA 対応であり、分散トランザクションに参加します。@Qualifier
を使用せずに Bean に注入できます。
Java
Kotlin
import jakarta.jms.ConnectionFactory;
public class MyBean {
public MyBean(ConnectionFactory connectionFactory) {
// ...
}
}
import jakarta.jms.ConnectionFactory
class MyBean(connectionFactory: ConnectionFactory?)
状況によっては、XA 以外の ConnectionFactory
を使用して特定の JMS メッセージを処理したい場合があります。例: JMS 処理ロジックは XA タイムアウトよりも長くかかる場合があります。
XA 以外の ConnectionFactory
を使用する場合は、nonXaJmsConnectionFactory
Bean を使用できます。
Java
Kotlin
import jakarta.jms.ConnectionFactory;
import org.springframework.beans.factory.annotation.Qualifier;
public class MyBean {
public MyBean(@Qualifier("nonXaJmsConnectionFactory") ConnectionFactory connectionFactory) {
// ...
}
}
import jakarta.jms.ConnectionFactory
import org.springframework.beans.factory.annotation.Qualifier
class MyBean(@Qualifier("nonXaJmsConnectionFactory") connectionFactory: ConnectionFactory?)
一貫性を保つために、jmsConnectionFactory
Bean は、Bean エイリアス xaJmsConnectionFactory
を使用して提供されます。
Java
Kotlin
import jakarta.jms.ConnectionFactory;
import org.springframework.beans.factory.annotation.Qualifier;
public class MyBean {
public MyBean(@Qualifier("xaJmsConnectionFactory") ConnectionFactory connectionFactory) {
// ...
}
}
import jakarta.jms.ConnectionFactory
import org.springframework.beans.factory.annotation.Qualifier
class MyBean(@Qualifier("xaJmsConnectionFactory") connectionFactory: ConnectionFactory?)
組み込みトランザクションマネージャーのサポート
XAConnectionFactoryWrapper
(Javadoc) および XADataSourceWrapper
(Javadoc) インターフェースは、組み込みトランザクションマネージャーをサポートするために使用できます。インターフェースは、XAConnectionFactory
および XADataSource
Bean をラップし、通常の ConnectionFactory
および DataSource
Bean として公開し、分散トランザクションに透過的に登録します。JtaTransactionManager
Bean と適切な XA ラッパー Bean が ApplicationContext
内に登録されている場合、DataSource および JMS 自動構成は JTA バリアントを使用します。