2012-03-28 38 views
0

这是我的代码有:处理HTTP从EJB事务中调用

// EJB

beanclass 1{ 

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
public String method1(){ 
method2(); 
DBupdates(); 

return ""; 
} 

} 

//普通的java类

class 2{ 
method 2(){ 
    //call which may take a long time (but dont want to wait for it to complete) 
    makes http calls to an external URL method(); 
}} 

的问题是:在HTTP通话可能需要很长时间。然而,调用的响应决定了方法1 - >数据库更新和响应中的后续步骤。响应需要返回最终用户,并且我不能让最终用户永远等待。

我可以用两种方式处理这种情况:

  1. 移动方法2到EJB,并把TransactionAttributeType.NEVER,使HTTP调用不在事务,方法1的交易不候在上面。在这种情况下,容器管理方法1的事务,并且不执行数据库更新,如果它没有从方法2回听,则返回null。 method1的事务在“返回”之前等待多长时间?

  2. 我可以使用JBoss注释并在method1()上放置2分钟的TransactionTimeout:在这种情况下,如果http调用在2分钟内未完成,则method1可以返回null并且不进行数据库更新。

这两种方法哪一种是明智的和防错的? 感谢您的见解。

回答

0
  1. 当您使用TransactionAttributeType.NEVER时,事务不会进一步传播。 对于返回Future<V>对象的方法,可以使用@Asynchronous注释。然后你可以在对象上调用get(timeout, unit)来得到结果类型V,它等待操作的给定时间,但它是EJB-3.1特定的。

  2. 可以在方法或类级别尝试JBoss特定标注@TransactionTimeout。也可以在jboss.xml或jboss-service.xml中配置它,具体取决于您的服务器版本。这对EJB-3.0来说会很好,但是会降低应用程序的可移植性。