2

XA (2 フェーズ) トランザクションを使用しています。Log クラスと Entity Manager を使用して、1 つのログ テーブルにログを記録したいと考えています。EJB セッション Bean 内の私のメソッドは次のようになります。

private void logError(Throwable throwable) {
    LogEntity logEntity = new LogEntity();
    // Set everything
    entityManager.persist(logEntity);
}

「外部」トランザクションから独立した、分離された(自律的な)トランザクションでそれを行いたいです。@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW)メソッド名の前にandを追加しようとしましたが@TransactionAttribute(value = TransactionAttributeType.NOT_SUPPORTED)、機能しません。

EJB3 メソッドを呼び出す前に、次のようなユーザー トランザクションを作成します。

try {
    UserTransaction transaction = (UserTransaction)context.lookup("javax.transaction.UserTransaction");
    transaction.begin();
    // Call EJB3 method
    transaction.commit();
} catch (Throwable t) {
    t.printStackTrace();
    try {
        transaction.rollback();
    } catch (SystemException e) {
        e.printStackTrace();
    }
}

コミットが完了したかどうかに関係なく、ログに記録したい。方法?

よろしく

4

1 に答える 1

0

トランザクション属性は、プロキシ経由で呼び出された場合にのみ関連します。これらは、プライベート メソッドを含む直接呼び出しには適用されません。次のようなことを試してください (EJB 3.1 の非インターフェース ビューを使用しますが、EJB 3.0 しかない場合は、ロギング用に別のローカル インターフェースを作成できます)。

@Stateless
@Local(BusinessInterface.class)
@LocalBean
public class MyBean {
  @EJB MyBean logger;

  @TransactionAttribute(REQUIRED)
  public void businessMethod() {
    try {
      ...
    } catch (Throwable t) {
      logger.logError(t);
      ...
    }
  }

  @TransactionAttribute(NOT_SUPPORTED)
  public void logError(Throwable t) {
    ...
  }
}

重要な部分は、logError への呼び出しが注入された EJB プロキシを介して発生することです。これにより、コンテナは、logErrorメソッドの実行中に XA トランザクションを一時停止する制御を行うことができます。

于 2012-05-23T16:31:52.833 に答える