我有一个EJB -
class ActivityProcessor{
@Resource
private SessionContext context;
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public boolean processActivity(Activity activity) throws Exception{
try{
//required code for processing activity
}catch(Exception ex){
//Exception while processing activity
handleException(ex,activity);
context.setRollbackOnly();
throw ex;
}
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void handleException(Exception ex, Activity activity) {
//Code to save this activity in exception table
}
}
我们有一个要求,即如果处理失败,我们希望将活动保存在异常DB表中。 但是使用上面的代码,如果 processActivity 中存在异常,我会在 handleException 方法中获得事务超时异常。 handleException 单独运行正常。< / p>
请告诉我这个EJB事务的问题。
我的理解是, 1.将为processActivity创建新事务
如果processActivity中存在异常,则会调用handleException。由于事务属性为REQUIRES_NEW,因此processActivity的事务将被暂停&amp;将为handleException
如果handleException成功,将保存handleException的事务。
processActivity的暂停交易将恢复,但由于 context.setRollbackOnly,它将被回滚。
答案 0 :(得分:2)
handleException
内部调用processActivity
,可能是容器使用相同的事务执行它{不会产生新的。handleException
或将其移动到其他bean。答案 1 :(得分:0)
嗯,这里的问题是您直接调用handleException
方法 。这样,应用程序服务器就没有机会注入事务处理代码。
尝试通过EJBObject
公开的SessionContext
调用相同的方法,如下所示:
class ActivityProcessor{
@Resource
private SessionContext context;
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public boolean processActivity(Activity activity) throws Exception{
try{
//required code for processing activity
}catch(Exception ex){
//Exception while processing activity
context.getBusinessObject(ActivityProcessor.class)
.handleException(ex,activity);
context.setRollbackOnly();
throw ex;
}
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void handleException(Exception ex, Activity activity) {
//Code to save this activity in exception table
}
}