コンテナ管理のトランザクションを使用する@Stateless
EJBがあります。の「ステータス」にアクセスする方法はありjavax.transaction.UserTransaction
ますか?つまりUserTransaction.getStatus()
、Beanメソッド内を呼び出すのですか?
コンテナ管理のBeanでアクセスUserTransaction
が禁止されていることは知っていますが、メソッドにアクセスする他の方法はありますgetStatus()
か?
コンテナ管理のトランザクションを使用する@Stateless
EJBがあります。の「ステータス」にアクセスする方法はありjavax.transaction.UserTransaction
ますか?つまりUserTransaction.getStatus()
、Beanメソッド内を呼び出すのですか?
コンテナ管理のBeanでアクセスUserTransaction
が禁止されていることは知っていますが、メソッドにアクセスする他の方法はありますgetStatus()
か?
If you only need to know if the transaction is marked for rollback, then use EJBContext.getRollbackOnly. Otherwise, with JTA 1.1, you can use TransactionSynchronizationRegistry:
TransactionSynchronizationRegistry tsr = (TransactionSynchronizationRegistry)
new InitialContext().lookup("java:comp/TransactionSynchronizationRegistry");
int status = tsr.getTransactionStatus()
UserTransaction
あなたはクラスの責任を理解していないと思います。現在実行中のトランザクションへのアクセスを提供するために存在しません。これは、特にBean管理のトランザクションを開始および終了するために、コンテナーのトランザクションマネージャーとの通信を開始するために使用されます。そのため、コンテナ管理のトランザクションコンテキストからアクセスしてはなりません。
getStatus()メソッドにアクセスする他の方法はありますか?
いいえ、少なくともEJBAPIを使用しないことはできません。せいぜい、EJBインターセプターを使用して、EJBメソッドが呼び出されたという事実をログに記録できます。呼び出し全体の状態を追跡し、トランザクションの状態を推測するには、非常にインテリジェントである必要があります。
コンテナ固有のAPIを使用することを嫌がらない場合は、基になるトランザクションにアクセスできる可能性があります。使用方法がわからない場合、またはコンテナで使用が禁止されている場合は、以下のアプローチが機能しない可能性があるため、注意してください。以下で説明するメカニズムは、SpringFrameworkがJTAトランザクションマネージャーにアクセスし、トランザクションを作成および管理する方法です。
Oracle WebLogicの場合、への参照をTranactionHelper class
取得できます。これを使用して、スレッドに関連付けられている現在のトランザクションへの参照を取得できます。このトランザクションのステータスを取得できます。他のアプリケーションサーバーでこのコースを受講する必要がある場合は、SpringフレームワークのTransaction SPIforJTAのソースを紹介します。