1

トランザクションの自動ロールバックをテストしたいと思います。したがって、システム例外をスローする単純なbean [src]を実装しました。これにより、自動的にロールバック[1]が発生します。また、インターフェースSessionSynchronizationを実装したので、 afterCompletionメソッドを使用してロールバックに影響を与えることができます。しかし、この方法の議論は真実であり、仕様に関しては誤りであると私は予想しています[2]。

何かが足りないのですか、それともこれはJBoss 7のバグですか?バグトラッカーを検索しましたが、何も見つかりませんでした...間違った単語を使用した可能性がありますか?

これがバグではない場合:システムまたはアプリケーションの例外が発生した場合にafterCompletionパラメーターをfalseに設定することに関する設定はありますか?


[1]:「コンテナ管理のトランザクションをロールバックする方法は2つあります。1つは、システム例外がスローされた場合、コンテナは自動的にトランザクションをロールバックします。2つ目は、EJBContextインターフェースのsetRollbackOnlyメソッドを呼び出すことです。メソッドは、トランザクションをロールバックするようにコンテナに指示します。Beanがアプリケーション例外をスローした場合、ロールバックは自動ではありませんが、setRollbackOnlyの呼び出しによって開始できます。」 http://docs.oracle.com/javaee/6/tutorial/doc/bncij.html

[2]:「afterCompletionメソッドはステートフルセッションBeanインスタンスにトランザクションコミットプロトコルが完了したことを通知し、トランザクションがコミットされたかロールバックされたかをインスタンスに通知します。」 http://docs.oracle.com/javaee/6/api/javax/ejb/SessionSynchronization.html

[src]:

@Stateful
@LocalBean
public class RollbackTestBean implements RollbackTest, SessionSynchronization {

  int counter = 0;
  int counterBuffer = 0;
  private final Logger logger = Logger.getLogger(this.getClass().getName());

  @Override
  public int getCounter() {
    return counter;
  }

  @Override
  public void throwSystemException() throws SystemException {
    counter++;
    throw new SystemException();
  }

  @Override
  public void afterBegin() throws EJBException, RemoteException {
    logger.info("[TX]: after begin");
    counterBuffer = counter;
  }

  @Override
  public void afterCompletion(boolean success) throws EJBException, RemoteException {
    logger.info("[TX]: after completion: " + success);
    if (!success)
      counter = counterBuffer;
  }

  @Override
  public void beforeCompletion() throws EJBException, RemoteException {
    logger.info("[TX]: before completion");
  }
}
4

1 に答える 1

2

2つのSystemExceptionsがあります

org.omg.CORBA.SystemException  subclass of RuntimeException
javax.transaction.SystemException subclass of Exception

org.omg.CORBA.SystemExceptionを使用していることを願っています

EJB3.1仕様では、RuntimeExceptionまたはApplicationExceptionの場合、トランザクションをロールバックする必要があるとされています。

私が見る限り、ApplcationExceptionはJBoss 7.1.1で正しく処理されますが、RuntimeExceptionでは処理されません。

RuntimeExceptionを使用すると、Statefull Beanでremove()が呼び出されたときに同様の問題が報告されます。ここを参照してください。RuntimeExceptionをスローしようとすると、同じエラーメッセージが表示されます。Verion7.1.3で修正されたと思います。しかし、私は自分自身をテストしていません。

修正を探している場合は、7.1.3を試すことができます。例外があり、トランザクションのロールバックが必要な場合は、

@ApplicationException(rollback=true)

マディ

于 2012-10-12T15:19:04.540 に答える