我有一个EJB拦截器,我遵循Adam Bien建议的BCE模式,也就是说,边界上的所有EJB调用都启动并完成一个事务,这意味着没有嵌套的EJB调用(虽然可能有嵌套的CDI注入Bean调用,但是那些应该在ejb Boundary开始的同一个交易中)。
所以在那些ejb Boundaries中我有一个拦截器,我想拦截或者知道在EJB的方法调用之后是否已经提交了transacction? (也就是说,如果涉及到EntitManager将COMMIT sql调用发送到DB并且返回成功)
注意:当然,如果我是EJB的客户端并且我正在调用该方法,那么在方法调用之后我知道事务发生了什么,但是我感兴趣的是在客户端收到EJB的响应之前拦截它。
@AroundInvoke
public Object logMethodEntry(InvocationContext ctx) throws Exception {
Object proceed = null;
try {
proceed = ctx.proceed();
// is the transacction finished/commited already?
// is it still open ?
return proceed;
} catch (Exception e) {
throw e;
}
}
[更新]:我接受了一个很好的答案,但问题是Java EE中没有办法接收已经被通过的事务事件。所以无论好的答案如何,遗憾的是,无法在Java EE中通知服务器内部已完成的事务,当然,如果您是客户端调用者,那么您确定知道事务已提交或回滚...