2013-05-27 67 views
3

我有一个EJB作为如下─在交易另一EJB方法处理异常属性REQUIRES_NEW

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将called.As事务属性是REQUIRES_NEW,processActivity的交易将被暂停&将为handle创建新的事务

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

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

回答

2
  • 你是从内部processActivity调用handleException,可能是容器的同一事务&执行它不会产生一个新的。
  • 尝试通过JNDI查找或注入来获取引用&然后调用handleException或将其移动到其他bean。
0

嗯,这里的缺点是,你是直接调用handleException方法。这样应用程序服务器就没有机会注入事务处理代码。

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 
} 
} 

尝试通过在由SessionContext露出作为EJBObject调用相同的方法