从EJB记录事务的成功

时间:2012-08-01 11:09:56

标签: java transactions ejb

我想记录参与事务的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);
  }
}

3 个答案:

答案 0 :(得分: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) {
    ......
}

答案 1 :(得分:1)

使用bean管理的事务,它可以控制UserTransaction的开始/提交/回滚。我建议将begin / commit / rollback逻辑添加到EJB拦截器,因为这样可以跨多个EJB重用逻辑。

答案 2 :(得分:-1)

不幸的是,我认为答案是“它取决于” - 我不相信有适用于所有情况的通用答案。例如,你没有说什么叫这些EJB。如果您的体系结构具有常见的“业务服务层”,那么将日志记录放在那里可能既实际又合理......

关于日志记录本身,我建议你不要做你上面做的事情。首先,不要调用.log本身。而是调用特定的日志级别(DEBUG,INFO等)。接下来,在调用log语句之前检查是否启用了此日志级别。是的,这是一个PITA,但在性能方面具有可衡量的结果。最后,尝试永远不要像上面那样记录一小段文本。记录是一种机会,可以提供您手中的日常文件中的一些有用信息。你错过了这个机会!如果您记录,至少记录一下您刚刚找到,创建或不存在的bean。

祝你好运!