JTA による分散トランザクション
Spring Boot は、JNDI から取得したトランザクションマネージャーを使用して、複数の XA リソースに分散された JTA トランザクションをサポートします。
JTA 環境が検出されると、トランザクションの管理に Spring の JtaTransactionManager
(Javadoc) が使用されます。自動構成された JMS、DataSource、JPA Bean は、XA トランザクションをサポートするようにアップグレードされます。分散トランザクションに参加するには、@Transactional
(Javadoc) などの標準の 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
(標準 Javadoc) を構成できます。
XA と非 XA JMS 接続の混在
JTA を使用する場合、プライマリ JMS ConnectionFactory
(英語) Bean は XA 対応であり、分散トランザクションに参加します。@Qualifier
(Javadoc) を使用せずに 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
(標準 Javadoc) Bean をラップし、通常の ConnectionFactory
(英語) および DataSource
(標準 Javadoc) Bean として公開して、分散トランザクションに透過的に登録するロールを担います。ApplicationContext
(Javadoc) 内に JtaTransactionManager
(Javadoc) Bean および適切な XA ラッパー Bean が登録されている場合、DataSource および JMS 自動構成では JTA バリアントが使用されます。