处理EJB事务中的http调用

时间:2012-03-28 19:50:49

标签: ejb-3.0

这是我的代码:

// 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. 将method2移入EJB并放入TransactionAttributeType.NEVER,以便http调用不在事务中,并且method1的事务不等待它。在这种情况下,容器管理方法1的事务并且不进行数据库更新,如果它没有从方法2收到回复,则返回null。 method1的交易在“返回”之前等待多长时间?

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

  3. 这两种方法中的哪一种是可取的和防错的? 感谢您的见解。

1 个答案:

答案 0 :(得分:0)

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

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