public class JmsTransactionManager extends AbstractPlatformTransactionManager implements ResourceTransactionManager, InitializingBean
ConnectionFactory
EE の PlatformTransactionManager
実装。JMS 接続 / セッションペアを指定された ConnectionFactory からスレッドにバインドし、ConnectionFactory ごとに 1 つのスレッドバインドセッションを可能にします。 このローカル戦略は、JTA トランザクション内で JMS 操作を実行する代わりになります。その利点は、メッセージブローカーをターゲットとして、スタンドアロンアプリケーションやテストスイートなどの任意の環境で動作できることです。ただし、この戦略では、メッセージングとデータベースアクセスの間でトランザクションを共有するためなど、XA トランザクションを提供できません。XA トランザクションには、完全な JTA/XA セットアップが必要です。通常、戦略として Spring の JtaTransactionManager
を使用します。
アプリケーションコードは、標準の Java EE スタイルの ConnectionFactory.createConnection()
EE 呼び出しではなく ConnectionFactoryUtils.getTransactionalSession(javax.jms.ConnectionFactory, javax.jms.Connection, boolean)
を介してトランザクション JMS セッションを取得し、その後にセッションを作成する必要があります。Spring の JmsTemplate
は、スレッドにバインドされたセッションを自動検出し、自動的にそれに参加します。
あるいは、アプリケーションコードが ConnectionFactory で標準の Java EE スタイルのルックアップパターンを使用できるようにすることもできます。たとえば、Spring をまったく認識しないレガシーコードの場合です。その場合は、ターゲット ConnectionFactory の TransactionAwareConnectionFactoryProxy
を定義します。これは、Spring 管理のトランザクションに自動的に参加します。
このトランザクションマネージャーのターゲットとして CachingConnectionFactory
を使用することを強くお勧めします。CachingConnectionFactory は、すべての JMS アクセスに単一の JMS 接続を使用して、繰り返される接続作成のオーバーヘッドを回避し、セッションのキャッシュを維持します。その後、各トランザクションは独自の JMS セッションを使用しながら、同じ JMS 接続を共有します。
未加工のターゲット ConnectionFactory の使用は、リソースの再利用が不足しているため、効率が悪いだけではありません。JMS ドライバーが Session.commit()
の前に MessageProducer.close()
呼び出しや MessageConsumer.close()
呼び出しを受け入れない場合にも奇妙な影響が生じる可能性があります。後者は、プロデューサーハンドルを通じて送信され、コンシューマーハンドルを通じて受信されたすべてのメッセージをコミットすることになっています。安全な一般的なソリューションとして、常に CachingConnectionFactory
をこのトランザクションマネージャーの "connectionFactory"
プロパティに渡します。
トランザクション同期はデフォルトでオフになっています。このマネージャーは、同期の必要性が高い JDBC DataSourceTransactionManager
などのデータストアベースの Spring トランザクションマネージャーと一緒に使用される可能性があるためです。
AbstractPlatformTransactionManager.SuspendedResourcesHolder
logger, SYNCHRONIZATION_ALWAYS, SYNCHRONIZATION_NEVER, SYNCHRONIZATION_ON_ACTUAL_TRANSACTION
コンストラクターと説明 |
---|
JmsTransactionManager() Bean スタイルの使用のために新しい JmsTransactionManager を作成します。 |
JmsTransactionManager(ConnectionFactoryEE connectionFactory) ConnectionFactory を指定して、新しい JmsTransactionManager を作成します。 |
修飾子と型 | メソッドと説明 |
---|---|
void | afterPropertiesSet() ConnectionFactory が設定されていることを確認します。 |
protected ConnectionEE | createConnection() このテンプレートの ConnectionFactory を介して JMS 接続を作成します。 |
protected SessionEE | createSession(ConnectionEE con) 指定された接続の JMS セッションを作成します。 |
protected void | doBegin(ObjectSE transaction, TransactionDefinition definition) 指定されたトランザクション定義に従って、セマンティクスで新しいトランザクションを開始します。 |
protected void | doCleanupAfterCompletion(ObjectSE transaction) トランザクション完了後にリソースをクリーンアップします。 |
protected void | doCommit(DefaultTransactionStatus status) 指定されたトランザクションの実際のコミットを実行します。 |
protected ObjectSE | doGetTransaction() 現在のトランザクション状態のトランザクションオブジェクトを返します。 |
protected void | doResume(ObjectSE transaction, ObjectSE suspendedResources) 現在のトランザクションのリソースを再開します。 |
protected void | doRollback(DefaultTransactionStatus status) 指定されたトランザクションの実際のロールバックを実行します。 |
protected void | doSetRollbackOnly(DefaultTransactionStatus status) 指定されたトランザクションをロールバックのみに設定します。 |
protected ObjectSE | doSuspend(ObjectSE transaction) 現在のトランザクションのリソースを一時停止します。 |
ConnectionFactoryEE | getConnectionFactory() このインスタンスがトランザクションを管理する必要がある JMS ConnectionFactory を返します。 |
ObjectSE | getResourceFactory() このトランザクションマネージャーが動作するリソースファクトリを返します。 |
protected boolean | isExistingTransaction(ObjectSE transaction) 指定されたトランザクションオブジェクトが既存のトランザクション(つまり、すでに開始されているトランザクション)を示しているかどうかを確認します。 |
protected ConnectionFactoryEE | obtainConnectionFactory() 実際に使用するために ConnectionFactory を取得します。 |
void | setConnectionFactory(ConnectionFactoryEE cf) このインスタンスがトランザクションを管理する必要がある JMS ConnectionFactory を設定します。 |
void | setLazyResourceRetrieval(boolean lazyResourceRetrieval) このトランザクションマネージャーがトランザクション( true )内のアクセス時に JMS 接続とセッションを遅延取得するかどうかを指定します。 |
commit, determineTimeout, getDefaultTimeout, getTransaction, getTransactionSynchronization, invokeAfterCompletion, isFailEarlyOnGlobalRollbackOnly, isGlobalRollbackOnParticipationFailure, isNestedTransactionAllowed, isRollbackOnCommitFailure, isValidateExistingTransaction, newTransactionStatus, prepareForCommit, prepareSynchronization, prepareTransactionStatus, registerAfterCompletionWithExistingTransaction, resume, rollback, setDefaultTimeout, setFailEarlyOnGlobalRollbackOnly, setGlobalRollbackOnParticipationFailure, setNestedTransactionAllowed, setRollbackOnCommitFailure, setTransactionSynchronization, setTransactionSynchronizationName, setValidateExistingTransaction, shouldCommitOnGlobalRollbackOnly, suspend, triggerBeforeCommit, triggerBeforeCompletion, useSavepointForNestedTransaction
cloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, toStringSE, waitSE, waitSE, waitSE
commit, getTransaction, rollback
public JmsTransactionManager()
メモ: インスタンスを使用する前に、ConnectionFactory を設定する必要があります。このコンストラクターは、BeanFactory を介して JmsTemplate を準備するために使用でき、通常は setConnectionFactory を介して ConnectionFactory を設定します。
このマネージャーは、DataSourceTransactionManager のようなデータストアベースの Spring トランザクションマネージャーと一緒に使用される可能性があるため、デフォルトでトランザクション同期をオフにします。いつでも 1 つのマネージャーのみが同期を実行できます。
public JmsTransactionManager(ConnectionFactoryEE connectionFactory)
connectionFactory
- 接続を取得する ConnectionFactorypublic void setConnectionFactory(@Nullable ConnectionFactoryEE cf)
@Nullable public ConnectionFactoryEE getConnectionFactory()
protected final ConnectionFactoryEE obtainConnectionFactory()
null
)IllegalStateExceptionSE
- ConnectionFactory セットがない場合 public void setLazyResourceRetrieval(boolean lazyResourceRetrieval)
true
)内のアクセス時に JMS 接続とセッションを遅延取得するかどうかを指定します。デフォルトでは、トランザクションの開始時に積極的に JMS 接続とセッションが作成されます(false
)。JmsResourceHolder.getConnection()
, JmsResourceHolder.getSession()
public void afterPropertiesSet()
InitializingBean
の afterPropertiesSet
public ObjectSE getResourceFactory()
ResourceTransactionManager
このターゲットリソースファクトリは、通常、スレッドごとの TransactionSynchronizationManager
のリソースバインディングのリソースキーとして使用されます。
ResourceTransactionManager
の getResourceFactory
null
)TransactionSynchronizationManager.bindResource(java.lang.Object, java.lang.Object)
, TransactionSynchronizationManager.getResource(java.lang.Object)
protected ObjectSE doGetTransaction()
AbstractPlatformTransactionManager
返されるオブジェクトは通常、具体的なトランザクションマネージャーの実装に固有のものであり、対応するトランザクション状態を変更可能な形式で保持します。このオブジェクトは、他のテンプレートメソッド (doBegin や doCommit など) に直接、または DefaultTransactionStatus インスタンスの一部として渡されます。
返されるオブジェクトには、既存のトランザクション、つまり、トランザクションマネージャーでの現在の getTransaction
呼び出しの前にすでに開始されているトランザクションに関する情報が含まれている必要があります。その結果、doGetTransaction
実装は通常、既存のトランザクションを探し、返されたトランザクションオブジェクトに対応する状態を格納します。
AbstractPlatformTransactionManager
の doGetTransaction
AbstractPlatformTransactionManager.doBegin(java.lang.Object, org.springframework.transaction.TransactionDefinition)
, AbstractPlatformTransactionManager.doCommit(org.springframework.transaction.support.DefaultTransactionStatus)
, AbstractPlatformTransactionManager.doRollback(org.springframework.transaction.support.DefaultTransactionStatus)
, DefaultTransactionStatus.getTransaction()
protected boolean isExistingTransaction(ObjectSE transaction)
AbstractPlatformTransactionManager
結果は、新しいトランザクションに対して指定された伝播動作に従って評価されます。既存のトランザクションが中断される(PROPAGATION_REQUIRES_NEW の場合)か、新しいトランザクションが既存のトランザクションに参加する可能性があります(PROPAGATION_REQUIRED の場合)。
デフォルト実装は false
を返しますが、既存のトランザクションへの参加は一般にサポートされていないと想定しています。もちろん、サブクラスはそのようなサポートを提供することをお勧めします。
AbstractPlatformTransactionManager
の isExistingTransaction
transaction
- doGetTransaction によって返されるトランザクションオブジェクト AbstractPlatformTransactionManager.doGetTransaction()
protected void doBegin(ObjectSE transaction, TransactionDefinition definition)
AbstractPlatformTransactionManager
このメソッドは、トランザクションマネージャーが実際に新しいトランザクションを開始することを決定したときに呼び出されます。以前にトランザクションがなかったか、前のトランザクションが中断されています。
特別なシナリオは、セーブポイントのないネストされたトランザクションです: useSavepointForNestedTransaction()
が "false" を返す場合、このメソッドは、必要に応じてネストされたトランザクションを開始するために呼び出されます。このようなコンテキストでは、アクティブなトランザクションがあります。このメソッドの実装はこれを検出し、適切なネストされたトランザクションを開始する必要があります。
AbstractPlatformTransactionManager
の doBegin
transaction
- doGetTransaction
によって返されたトランザクションオブジェクト definition
- 伝播動作、分離レベル、読み取り専用フラグ、タイムアウト、トランザクション名を記述する TransactionDefinition インスタンス protected ObjectSE doSuspend(ObjectSE transaction)
AbstractPlatformTransactionManager
トランザクションの一時停止が一般的にサポートされていないと仮定すると、デフォルトの実装は TransactionSuspensionNotSupportedException をスローします。
AbstractPlatformTransactionManager
の doSuspend
transaction
- doGetTransaction
によって返されたトランザクションオブジェクト AbstractPlatformTransactionManager.doResume(java.lang.Object, java.lang.Object)
protected void doResume(@Nullable ObjectSE transaction, ObjectSE suspendedResources)
AbstractPlatformTransactionManager
トランザクションの一時停止が一般的にサポートされていないと仮定すると、デフォルトの実装は TransactionSuspensionNotSupportedException をスローします。
AbstractPlatformTransactionManager
の doResume
transaction
- doGetTransaction
によって返されたトランザクションオブジェクト suspendedResources
- doSuspend によって返される、中断されたリソースを保持するオブジェクト AbstractPlatformTransactionManager.doSuspend(java.lang.Object)
protected void doCommit(DefaultTransactionStatus status)
AbstractPlatformTransactionManager
実装では、「新規トランザクション」フラグまたはロールバック専用フラグを確認する必要はありません。これはすでに以前に処理されています。通常、渡されたステータスに含まれるトランザクションオブジェクトに対してストレートコミットが実行されます。
AbstractPlatformTransactionManager
の doCommit
status
- トランザクションのステータス表現 DefaultTransactionStatus.getTransaction()
protected void doRollback(DefaultTransactionStatus status)
AbstractPlatformTransactionManager
実装では、「新しいトランザクション」フラグを確認する必要はありません。これはすでに以前に処理されています。通常、渡されたステータスに含まれるトランザクションオブジェクトに対してストレートロールバックが実行されます。
AbstractPlatformTransactionManager
の doRollback
status
- トランザクションのステータス表現 DefaultTransactionStatus.getTransaction()
protected void doSetRollbackOnly(DefaultTransactionStatus status)
AbstractPlatformTransactionManager
既存のトランザクションへの参加は一般にサポートされていないと想定して、デフォルトの実装は IllegalTransactionStateException をスローします。もちろん、サブクラスはそのようなサポートを提供することをお勧めします。
AbstractPlatformTransactionManager
の doSetRollbackOnly
status
- トランザクションのステータス表現 protected void doCleanupAfterCompletion(ObjectSE transaction)
AbstractPlatformTransactionManager
doCommit
および doRollback
の実行後に、結果について呼び出されます。デフォルトの実装は何もしません。
例外をスローするべきではなく、エラーに対して警告を発行するだけです。
AbstractPlatformTransactionManager
の doCleanupAfterCompletion
transaction
- doGetTransaction
によって返されたトランザクションオブジェクト protected ConnectionEE createConnection() throws JMSExceptionEE
この実装では、JMS 1.1 API を使用します。
JMSExceptionEE
- JMS API メソッドによってスローされた場合 protected SessionEE createSession(ConnectionEE con) throws JMSExceptionEE
この実装では、JMS 1.1 API を使用します。
con
- セッションを作成する JMS 接続 JMSExceptionEE
- JMS API メソッドによってスローされた場合