我想记录参与事务的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);
}
}
答案 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。
祝你好运!