2

コンテナー管理トランザクションを使用するMDBがあります(私のコンテナーはIBM Websphere 7です)。

Websphereはグローバル(JTA)トランザクションを使用しています。

MDBスレッドがワーカースレッドを開始し、そのスレッドがトランザクションを開始した場合、その新しいスレッドはMDBと同じトランザクション内にありますか?

ワーカースレッドが正常に開始されるとすぐに、MDBスレッドがトランザクションをコミットし、MQメッセージを確認するようにします。ワーカースレッドがロールバックした場合にMDBをロールバックしたくありません。

編集:スレッドのコードにはこれがあります-注釈を使用していません:

    txn = (UserTransaction)ctx.lookup("java:comp/UserTransaction");
    txn.begin();

したがって、txn.getStatus()を見ると、STATUS_NO_TRANSACTION以外の値になります。したがって、Websphere 7に適したトランザクションマネージャーを取得し、txn.begin()の前に「suspend()」を呼び出す必要がありますか?問題を防ぐための正しいアプローチはありますか?

4

2 に答える 2

2

メソッドと同じトランザクションにあってはならないコードをonMessage()別のメソッドに入れ、そのメソッドのトランザクション属性を に設定しREQUIRES_NEWます。これにより、メソッドが呼び出されたときに新しいトランザクションが作成され、この新しいトランザクションの成功または失敗は既存のトランザクションには影響しません。

ところで、JavaEE アプリケーションでは明示的なスレッド管理を行うべきではありません。

EJB 3.0 仕様から:

エンタープライズ Bean は、スレッドの管理を試みてはなりません。エンタープライズ Bean は、スレッドの開始、停止、一時停止、再開、またはスレッドの優先順位や名前の変更を試みてはなりません。エンタープライズ Bean は、スレッド グループの管理を試みてはなりません。

タイマー サービスを使用して、スレッド管理をサーバーに任せながら、別のスレッドを効果的に作成することを検討できます。

于 2012-11-15T19:54:13.903 に答える
1

ejb 3.1 を使用している場合、次のアノテーションが付けられたメソッドでワーカーの作業を行うオプションがあります。

@Asynchronous

これにより、新しいトランザクションが提供され、作業は別のスレッドで実行されます。

http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/asyncMethodOfEJB/AsyncMethodEJB.html

デフォルトのトランザクション モードの詳細:非同期メソッドのデフォルトの EJB トランザクション モード?

于 2012-11-15T20:30:58.267 に答える