拦截 EJB 事务回滚
Intercept EJB transaction rollback
我有一个任务要完成,涉及在回滚我的 EJB 事务时回滚对非事务数据库的更改。
项目使用容器管理的事务,业务逻辑涉及调用EJB方法,而EJB方法本身调用其他EJB方法,因此事务跨越方法边界,涉及多个EJB。
EJB 事务回滚工作正常,但我需要能够检测到它已经发生,然后触发将尝试回滚其他非事务数据库的方法。
我想知道是否使用拦截器,但似乎我只能拦截特定的方法调用或特定的 EJB 生命周期事件。这对我的目的来说还不够。我需要拦截事务回滚事件。这可能吗?我是不是找错树了?也许还有另一种方法更适合我的目的。
我看到了一个相关问题,但它并没有真正帮助我,因为我有很多入口点、很多嵌套方法,而且我不能只拦截一个方法。
如果你使用的是Container Managed Transactions,那么当EJB方法调用成功时,保证事务已经提交,如果出现异常,则保证事务已经回滚。
所以我看到的一种可能的方法是在实际的 EJB 调用周围使用 EJB 包装器(REQUIRES_NEW
在这里很重要)。
@Stateless
public class EJBWrapper {
@EJB
private EJBService service;
public void wrapperMethod() {
try {
service.actualMethod(); // the real work is done here
} catch (RuntimeException) {
// transaction has been rolled back here
}
}
}
@Stateless
public class EJBService {
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void actualMethod() {
// do your work here
}
}
您需要对每个相关服务进行包装。
我有一个任务要完成,涉及在回滚我的 EJB 事务时回滚对非事务数据库的更改。
项目使用容器管理的事务,业务逻辑涉及调用EJB方法,而EJB方法本身调用其他EJB方法,因此事务跨越方法边界,涉及多个EJB。
EJB 事务回滚工作正常,但我需要能够检测到它已经发生,然后触发将尝试回滚其他非事务数据库的方法。
我想知道是否使用拦截器,但似乎我只能拦截特定的方法调用或特定的 EJB 生命周期事件。这对我的目的来说还不够。我需要拦截事务回滚事件。这可能吗?我是不是找错树了?也许还有另一种方法更适合我的目的。
我看到了一个相关问题,但它并没有真正帮助我,因为我有很多入口点、很多嵌套方法,而且我不能只拦截一个方法。
如果你使用的是Container Managed Transactions,那么当EJB方法调用成功时,保证事务已经提交,如果出现异常,则保证事务已经回滚。
所以我看到的一种可能的方法是在实际的 EJB 调用周围使用 EJB 包装器(REQUIRES_NEW
在这里很重要)。
@Stateless
public class EJBWrapper {
@EJB
private EJBService service;
public void wrapperMethod() {
try {
service.actualMethod(); // the real work is done here
} catch (RuntimeException) {
// transaction has been rolled back here
}
}
}
@Stateless
public class EJBService {
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void actualMethod() {
// do your work here
}
}
您需要对每个相关服务进行包装。