2

今日、EJBで予期しない動作を発見しました。デフォルトのトランザクション属性(REQUIRED)を持つMDBと、トランザクション属性がに設定されたSLSBがありますREQUIRES_NEW。私のMDBはSLSBを呼び出し、SLSBがスローできる例外をキャッチします。SLSBで本当に悪いことが発生し、のサブクラスRuntimeExceptionがスローされたとき。次に、SLSB用に作成された新しいトランザクションがロールバックのマークになりました。私の観点からは、これは正しい動作です。次に、MDBはこの例外をキャッチし、再スローして何らかのアクション(たとえば、ログにメッセージを書き込む)を実行します。しかし、MDBトランザクションもどういうわけかロールバックのマークが付けられたので、私には奇妙に思えます。この動作は正しいですか?

より正確に言うと、実際のコードに似たコードを記述して、この動作を生成することができます。

@MessageDriven
public class A{

@EJB
private B b;

@Overried
public void onMessage(Message msg){
...
try{
b.process(msg);
} catch (Throwable t){
logger.error("Something gone wrong",t);
}
...
}

そして、SLSBは次のようになります。

@EJB
@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public class B{
public void process(Message msg){
...
}
}

問題のあるタスクフローは次のようになります。

  1. メッセージ駆動型BeanonMessage(Message)が呼び出されました。
  2. メッセージ駆動型Beanは、いくつかのアクションを正常に実行してから、メソッドを呼び出しB.process(Message)ます。
  3. 何か悪いことがB起こり、RuntimeException投げられました。
  4. RuntimeExceptionラップされEJBException、メッセージ駆動型Beanによって正常にキャッチされました。
  5. メッセージ駆動型BeanonMessage(Message)メソッドは完全に実行されましたが、そのトランザクションはロールバックのマークが付けられました

誰かがこの行動を説明できますか?前もって感謝します。

4

2 に答える 2

0

この問題の解決策が見つかりました。実際にはbeanTransactionAttributeの抽象スーパークラスにアノテーションが付けられていて、無視されていました。BWebLogic サーバーの EJB ランタイム環境は、Bスーパークラスからのアノテーションを無視し、デフォルトREQUIRED属性を使用します。同じ問題に遭遇した場合は、EJB 3.1 仕様のセクション13.3.7.1を読むことをお勧めします (ここからダウンロードできます)。

于 2012-09-11T13:17:55.770 に答える