3

我有一个 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 
     }
}

我们有一个要求,如果处理失败,我们希望将活动保存在异常数据库表中。但是使用上面的代码,如果processActivity有异常,我会在handleException方法中得到事务超时异常。handleException单独工作正常。

如果这个 EJB 事务的问题,请建议我。

我的理解是,1.将为processActivity创建新事务

  1. 如果processActivity发生异常,会调用handleException。由于事务属性为REQUIRES_NEW,processActivity的事务会被挂起,handleException会创建新事务

  2. 如果handleException成功,handleException的事务将被保存。

  3. processActivity 暂停的事务将被恢复,但由于 context.setRollbackOnly,它将被回滚。

4

2 回答 2

2
  • 您是handleException从内部调用的processActivity,可能容器使用相同的事务执行它并且不会产生新的事务。
  • 尝试通过 JNDI 查找或注入获取引用,然后调用handleException或将其移动到其他 bean。
于 2013-05-27T08:03:53.830 回答
0

好吧,这里的问题是您正在直接handleException调用该方法。这样应用服务器就没有机会注入事务处理代码。

尝试通过asEJBObject公开的方法调用相同的方法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 
 }
}
于 2013-05-28T20:48:50.203 回答