【发布时间】:2015-03-02 07:26:33
【问题描述】:
我有一个 EJB 拦截器,我遵循 Adam Bien 建议的 BCE 模式,即边界上的所有 EJB 调用都开始并完成一个事务,这意味着没有嵌套的 EJB 调用(可能有嵌套的 CDI 注入的 Bean 调用虽然,但那些应该在从 ejb 边界开始的同一个事务中)。
所以在那些 ejb 边界中我有一个拦截器,我想拦截或知道在 EJB 的方法调用之后事务是否已经提交? (也就是说,如果涉及到 EntityManager,则 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 中无法在服务器内部通知已完成事务,当然,如果您是客户端调用者,那么您肯定知道事务已提交或回滚......
【问题讨论】:
-
我想你可能误会了 Adam Bien。您写道“边界上的所有 EJB 调用都开始并完成一个事务,这意味着没有嵌套的 EJB 调用”,但这不是真的。您可以嵌套 EJB 调用,除非您专门覆盖它,否则调用将发生在同一个事务中。无论如何,我不认为 BCE 意味着您不能在单个边界调用中使用多个事务。最后一个提示:
AroundInvoke调用发生在与方法相同的事务中,因此无法实现您问题中的代码注释。
标签: java jakarta-ee ejb cdi