クラス JmsTransactionManager

実装されたすべてのインターフェース:
SerializableSEInitializingBeanConfigurableTransactionManagerPlatformTransactionManagerResourceTransactionManagerTransactionManager

public class JmsTransactionManager extends AbstractPlatformTransactionManager implements ResourceTransactionManager, InitializingBean
単一の JMS ConnectionFactoryEEPlatformTransactionManager 実装。JMS 接続 / セッションペアを指定された ConnectionFactory からスレッドにバインドし、ConnectionFactory ごとに 1 つのスレッドバインドセッションを可能にします。

このローカル戦略は、JTA トランザクション内で JMS 操作を実行する代わりになります。その利点は、メッセージブローカーをターゲットとして、スタンドアロンアプリケーションやテストスイートなどの任意の環境で動作できることです。ただし、この戦略では、メッセージングとデータベースアクセスの間でトランザクションを共有するためなど、XA トランザクションを提供できません。XA トランザクションには、完全な JTA/XA セットアップが必要です。通常、戦略として Spring の JtaTransactionManager を使用します。

後続のセッション作成を伴う標準の Jakarta EE スタイルの ConnectionFactory.createConnection()EE 呼び出しの代わりに、ConnectionFactoryUtils.getTransactionalSession(jakarta.jms.ConnectionFactory, jakarta.jms.Connection, boolean) を介してトランザクション JMS セッションを取得するには、アプリケーションコードが必要です。Spring の JmsTemplate は、スレッドにバインドされたセッションを自動検出し、自動的に参加します。

または、アプリケーションコードが ConnectionFactory で標準の Jakarta EE スタイルルックアップパターンを使用できるようにすることもできます。たとえば、Spring をまったく認識しないレガシーコードの場合です。その場合、Spring 管理のトランザクションに自動的に参加するターゲット ConnectionFactory の TransactionAwareConnectionFactoryProxy を定義します。

このトランザクションマネージャーのターゲットとして CachingConnectionFactory を使用することを強くお勧めします。CachingConnectionFactory は、すべての JMS アクセスに単一の JMS 接続を使用して、繰り返される接続作成のオーバーヘッドを回避し、セッションのキャッシュを維持します。その後、各トランザクションは独自の JMS セッションを使用しながら、同じ JMS 接続を共有します。

未加工のターゲット ConnectionFactory の使用は、リソースの再利用が不足しているため、効率が悪いだけではありません。JMS ドライバーが Session.commit() の前に MessageProducer.close() 呼び出しや MessageConsumer.close() 呼び出しを受け入れない場合にも奇妙な影響が生じる可能性があります。後者は、プロデューサーハンドルを通じて送信され、コンシューマーハンドルを通じて受信されたすべてのメッセージをコミットすることになっています。安全な一般的なソリューションとして、常に CachingConnectionFactory をこのトランザクションマネージャーの "connectionFactory" プロパティに渡します。

トランザクション同期はデフォルトでオフになっています。このマネージャーは、同期の必要性が高い JDBC DataSourceTransactionManager などのデータストアベースの Spring トランザクションマネージャーと一緒に使用される可能性があるためです。

導入:
1.1
作成者:
Juergen Hoeller
関連事項:
  • コンストラクターの詳細

    • JmsTransactionManager

      public JmsTransactionManager()
      Bean スタイルの使用のために新しい JmsTransactionManager を作成します。

      メモ: ConnectionFactory は、インスタンスを使用する前に設定する必要があります。このコンストラクターは、BeanFactory を介して JmsTemplate を準備するために使用できます。通常は、setConnectionFactory を介して ConnectionFactory を設定します。

      このマネージャーは、DataSourceTransactionManager のようなデータストアベースの Spring トランザクションマネージャーと一緒に使用される可能性があるため、デフォルトでトランザクション同期をオフにします。いつでも 1 つのマネージャーのみが同期を実行できます。

      関連事項:
    • JmsTransactionManager

      public JmsTransactionManager(ConnectionFactoryEE connectionFactory)
      ConnectionFactory を指定して、新しい JmsTransactionManager を作成します。
      パラメーター:
      connectionFactory - 接続を取得する ConnectionFactory
  • メソッドの詳細

    • setConnectionFactory

      public void setConnectionFactory(@Nullable ConnectionFactoryEE cf)
      このインスタンスがトランザクションを管理する必要がある JMS ConnectionFactory を設定します。
    • getConnectionFactory

      @Nullable public ConnectionFactoryEE getConnectionFactory()
      このインスタンスがトランザクションを管理する必要がある JMS ConnectionFactory を返します。
    • obtainConnectionFactory

      protected final ConnectionFactoryEE obtainConnectionFactory()
      実際に使用するために ConnectionFactory を取得します。
      戻り値:
      ConnectionFactory (非 null)
      例外:
      IllegalStateExceptionSE - ConnectionFactory セットがない場合
      導入:
      5.0
    • setLazyResourceRetrieval

      public void setLazyResourceRetrieval(boolean lazyResourceRetrieval)
      このトランザクションマネージャーがトランザクション(true)内のアクセス時に JMS 接続とセッションを遅延取得するかどうかを指定します。デフォルトでは、トランザクションの開始時に積極的に JMS 接続とセッションが作成されます(false)。
      導入:
      5.1.6
      関連事項:
    • afterPropertiesSet

      public void afterPropertiesSet()
      ConnectionFactory が設定されていることを確認します。
      次で指定:
      インターフェース InitializingBeanafterPropertiesSet 
    • getResourceFactory

      public ObjectSE getResourceFactory()
      インターフェースからコピーされた説明: ResourceTransactionManager
      このトランザクションマネージャーが動作するリソースファクトリを返します。JDBC DataSource または JMS ConnectionFactory。

      このターゲットリソースファクトリは、通常、スレッドごとの TransactionSynchronizationManager のリソースバインディングのリソースキーとして使用されます。

      次で指定:
      インターフェース ResourceTransactionManagergetResourceFactory 
      戻り値:
      ターゲットリソースファクトリ (非 null)
      関連事項:
    • doGetTransaction

      protected ObjectSE doGetTransaction()
      クラスからコピーされた説明: AbstractPlatformTransactionManager
      現在のトランザクション状態のトランザクションオブジェクトを返します。

      返されるオブジェクトは通常、具体的なトランザクションマネージャーの実装に固有であり、対応するトランザクション状態を変更可能な形で保持します。このオブジェクトは、直接または DefaultTransactionStatus インスタンスの一部として、他のテンプレートメソッド(doBegin や doCommit など)に渡されます。

      返されるオブジェクトには、既存のトランザクション、つまり、トランザクションマネージャーでの現在の getTransaction 呼び出しの前にすでに開始されているトランザクションに関する情報が含まれている必要があります。その結果、doGetTransaction 実装は通常、既存のトランザクションを探し、返されたトランザクションオブジェクトに対応する状態を格納します。

      次で指定:
      クラス AbstractPlatformTransactionManagerdoGetTransaction 
      戻り値:
      現在のトランザクションオブジェクト
      関連事項:
    • isExistingTransaction

      protected boolean isExistingTransaction(ObjectSE transaction)
      クラスからコピーされた説明: AbstractPlatformTransactionManager
      指定されたトランザクションオブジェクトが既存のトランザクション(つまり、すでに開始されているトランザクション)を示しているかどうかを確認します。

      結果は、新しいトランザクションに対して指定された伝播動作に従って評価されます。既存のトランザクションが中断される(PROPAGATION_REQUIRES_NEW の場合)か、新しいトランザクションが既存のトランザクションに参加する可能性があります(PROPAGATION_REQUIRED の場合)。

      デフォルト実装は false を返しますが、既存のトランザクションへの参加は一般にサポートされていないと想定しています。もちろん、サブクラスはそのようなサポートを提供することをお勧めします。

      オーバーライド:
      クラス AbstractPlatformTransactionManagerisExistingTransaction 
      パラメーター:
      transaction - doGetTransaction によって返されるトランザクションオブジェクト
      戻り値:
      既存のトランザクションがある場合
      関連事項:
    • doBegin

      protected void doBegin(ObjectSE transaction, TransactionDefinition definition)
      クラスからコピーされた説明: AbstractPlatformTransactionManager
      指定されたトランザクション定義に従って、セマンティクスで新しいトランザクションを開始します。伝播動作の適用を気にする必要はありません。これは、この抽象マネージャーによってすでに処理されているためです。

      このメソッドは、トランザクションマネージャーが実際に新しいトランザクションを開始することを決定したときに呼び出されます。以前にトランザクションがなかったか、前のトランザクションが中断されています。

      特別なシナリオは、セーブポイントのないネストされたトランザクションです: useSavepointForNestedTransaction() が "false" を返す場合、このメソッドは、必要に応じてネストされたトランザクションを開始するために呼び出されます。このようなコンテキストでは、アクティブなトランザクションがあります。このメソッドの実装はこれを検出し、適切なネストされたトランザクションを開始する必要があります。

      次で指定:
      クラス AbstractPlatformTransactionManagerdoBegin 
      パラメーター:
      transaction - doGetTransaction によって返されるトランザクションオブジェクト
      definition - 伝播動作、分離レベル、読み取り専用フラグ、タイムアウト、トランザクション名を記述する TransactionDefinition インスタンス
    • doSuspend

      protected ObjectSE doSuspend(ObjectSE transaction)
      クラスからコピーされた説明: AbstractPlatformTransactionManager
      現在のトランザクションのリソースを一時停止します。トランザクションの同期はすでに中断されています。

      トランザクションの一時停止が一般的にサポートされていないと仮定すると、デフォルトの実装は TransactionSuspensionNotSupportedException をスローします。

      オーバーライド:
      クラス AbstractPlatformTransactionManagerdoSuspend 
      パラメーター:
      transaction - doGetTransaction によって返されるトランザクションオブジェクト
      戻り値:
      中断されたリソースを保持するオブジェクト (doResume に渡すために未検査のままになります)
      関連事項:
    • doResume

      protected void doResume(@Nullable ObjectSE transaction, ObjectSE suspendedResources)
      クラスからコピーされた説明: AbstractPlatformTransactionManager
      現在のトランザクションのリソースを再開します。トランザクションの同期はその後再開されます。

      トランザクションの一時停止が一般的にサポートされていないと仮定すると、デフォルトの実装は TransactionSuspensionNotSupportedException をスローします。

      オーバーライド:
      クラス AbstractPlatformTransactionManagerdoResume 
      パラメーター:
      transaction - doGetTransaction によって返されるトランザクションオブジェクト
      suspendedResources - doSuspend によって返される、中断されたリソースを保持するオブジェクト
      関連事項:
    • doCommit

      protected void doCommit(DefaultTransactionStatus status)
      クラスからコピーされた説明: AbstractPlatformTransactionManager
      指定されたトランザクションの実際のコミットを実行します。

      実装では、「新規トランザクション」フラグまたはロールバック専用フラグを確認する必要はありません。これはすでに以前に処理されています。通常、渡されたステータスに含まれるトランザクションオブジェクトに対してストレートコミットが実行されます。

      次で指定:
      クラス AbstractPlatformTransactionManagerdoCommit 
      パラメーター:
      status - トランザクションのステータス表現
      関連事項:
    • doRollback

      protected void doRollback(DefaultTransactionStatus status)
      クラスからコピーされた説明: AbstractPlatformTransactionManager
      指定されたトランザクションの実際のロールバックを実行します。

      実装では、「新しいトランザクション」フラグを確認する必要はありません。これはすでに以前に処理されています。通常、渡されたステータスに含まれるトランザクションオブジェクトに対してストレートロールバックが実行されます。

      次で指定:
      クラス AbstractPlatformTransactionManagerdoRollback 
      パラメーター:
      status - トランザクションのステータス表現
      関連事項:
    • doSetRollbackOnly

      protected void doSetRollbackOnly(DefaultTransactionStatus status)
      クラスからコピーされた説明: AbstractPlatformTransactionManager
      指定されたトランザクションをロールバックのみに設定します。現在のトランザクションが既存のトランザクションに参加している場合にのみ、ロールバック時に呼び出されます。

      既存のトランザクションへの参加は一般にサポートされていないと想定して、デフォルトの実装は IllegalTransactionStateException をスローします。もちろん、サブクラスはそのようなサポートを提供することをお勧めします。

      オーバーライド:
      クラス AbstractPlatformTransactionManagerdoSetRollbackOnly 
      パラメーター:
      status - トランザクションのステータス表現
    • doCleanupAfterCompletion

      protected void doCleanupAfterCompletion(ObjectSE transaction)
      クラスからコピーされた説明: AbstractPlatformTransactionManager
      トランザクション完了後にリソースをクリーンアップします。

      doCommit および doRollback の実行後に、結果について呼び出されます。デフォルトの実装は何もしません。

      例外をスローするべきではなく、エラーに対して警告を発行するだけです。

      オーバーライド:
      クラス AbstractPlatformTransactionManagerdoCleanupAfterCompletion 
      パラメーター:
      transaction - doGetTransaction によって返されるトランザクションオブジェクト
    • createConnection

      protected ConnectionEE createConnection() throws JMSExceptionEE
      このテンプレートの ConnectionFactory を介して JMS 接続を作成します。

      この実装では、JMS 1.1 API を使用します。

      戻り値:
      新しい JMS 接続
      例外:
      JMSExceptionEE - JMS API メソッドによってスローされた場合
    • createSession

      protected SessionEE createSession(ConnectionEE con) throws JMSExceptionEE
      指定された接続の JMS セッションを作成します。

      この実装では、JMS 1.1 API を使用します。

      パラメーター:
      con - セッションを作成する JMS 接続
      戻り値:
      新しい JMS セッション
      例外:
      JMSExceptionEE - JMS API メソッドによってスローされた場合