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/UserTransactionjava: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 バリアントが使用されます。