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 的开始/提交/回滚。我建议将开始/提交/回滚逻辑添加到 EJB 拦截器中,因为这可以让您跨多个 EJB 重用逻辑。

于 2012-08-01T12:53:14.163 回答
-1

不幸的是,我认为答案是“视情况而定”——我不相信有一个适用于所有情况的通用答案。例如,您不说是什么在调用这些 EJB。如果您的架构具有常见的“业务服务层”,那么将日志记录放在那里可能既实用又明智......

关于日志记录本身,我建议您不要执行上述操作。首先,不要调用 .log 本身。而是调用特定的日志级别(DEBUG、INFO 等)。接下来,在调用日志语句之前检查是否启用了此日志级别。是的,这是一个 PITA,但在性能方面具有可衡量的结果。最后,尽量不要像上面所做的那样记录一点简单的文本。日志记录是一个将您掌握的一些有用信息提供给日志文件的机会。你错过了这个机会!如果你记录,至少记录一些关于你刚刚找到、创建或没有的 bean 的信息。

祝你好运!

于 2012-08-01T11:32:30.397 回答