使用事务属性REQUIRES_NEW处理另一个EJB方法中的异常

时间:2013-05-27 05:39:46

标签: transactions ejb ejb-3.0

我有一个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创建新事务

  1. 如果processActivity中存在异常,则会调用handleException。由于事务属性为REQUIRES_NEW,因此processActivity的事务将被暂停&amp;将为handleException

  2. 创建新事务
  3. 如果handleException成功,将保存handleException的事务。

  4. processActivity的暂停交易将恢复,但由于 context.setRollbackOnly,它将被回滚。

2 个答案:

答案 0 :(得分:2)

  • 您正在handleException内部调用processActivity,可能是容器使用相同的事务执行它{不会产生新的。
  • 尝试通过JNDI查找或注入&amp; amp;然后调用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 
 }
}