2

トランザクションに参加しているEJBメソッドのエラーまたは成功をログに記録したいと思います。伐採はどこに置けばいいですか?私の知る限り、トランザクションは私のdoSomething終了後にコミットされます。したがって、その方法では、コミットが成功するかどうかはわかりません。それはこの質問を提起しました。

public class MyEjb {

  @Inject
  AnotherEjb anotherEjb;

  @Inject
  LoggerEjb logger;

  public void doSomeThing() {
     MyBean b = getSomething();
     anotherEjb.persistSg(b);

     /* logger.log is transaction if of attrubute NOT_SUPPORTED to
        ensure separation from caller transaction */
     logger.log("Did something successfully.");
  }

}

public class AnotherEjb {

  @Inject
  EntitiyManager em;

  public void persistSg(MyBean entity) {
    em.persist(entity);
  }
}
4

3 に答える 3

2

CDIのトランザクションオブザーバーを試しましたか?

http://docs.jboss.org/weld/reference/latest/en-US/html/events.html#d0e4075

このコードはイベントを発生させます:

@Inject Event<CategoryUpdate> categoryUpdateEvent;

public void someTransactionalMethod() {
    CategoryUpdate categoryUpdate = new CategoryUpdate();
    categoryUpdateEvent.fire(categoryUpdate);
}

そして、このコードは同じイベントを監視しますが、トランザクションが成功した場合にのみ呼び出されます。

public void refreshCategoryTree(@Observes(during = AFTER_SUCCESS) CategoryUpdate event) {
    ......
}
于 2012-12-09T23:40:30.897 に答える
1

Bean管理のトランザクションを使用します。これにより、UserTransactionの開始/コミット/ロールバックを制御できます。begin / commit / rollbackロジックをEJBインターセプターに追加することをお勧めします。これにより、複数のEJB間でロジックを再利用できるようになります。

于 2012-08-01T12:53:14.163 に答える
-1

残念ながら、答えは「状況によって異なります」だと思います。あらゆる状況に当てはまる汎用的な答えがあるとは思いません。たとえば、これらのEJBを何と呼んでいるのかはわかりません。アーキテクチャに一般的な「ビジネスサービス層」がある場合は、そこにロギングを配置することが実用的かつ賢明である可能性があります。

ロギング自体に関しては、上記で行っていることを行わないことをお勧めします。まず、.log自体を呼び出さないでください。むしろ、特定のログレベル(DEBUG、INFOなど)を呼び出します。次に、logステートメントを呼び出す前に、このログレベルが有効になっていることを確認します。はい、これはPITAですが、パフォーマンス面で測定可能な結果が得られます。最後に、上記のように単純なテキストをログに記録しないようにしてください。ロギングは、手元にあった有用な情報をログファイルに提供するチャンスです。このチャンスを逃します!ログに記録する場合は、少なくとも、見つけた、作成したばかりのBeanについて、またはそうでないものについて何かをログに記録します。

頑張ってください!

于 2012-08-01T11:32:30.397 に答える