这是我的代码:
// 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中的后续步骤 - >数据库更新和响应。响应需要回到最终用户,我不能让最终用户永远等待。
我可以通过两种方式处理这种情况:
将method2移入EJB并放入TransactionAttributeType.NEVER,以便http调用不在事务中,并且method1的事务不等待它。在这种情况下,容器管理方法1的事务并且不进行数据库更新,如果它没有从方法2收到回复,则返回null。 method1的交易在“返回”之前等待多长时间?
我可以使用JBoss注释并在method1()上放置2分钟的TransactionTimeout:在这种情况下,如果http调用在2分钟内没有完成,则method1可以返回null并且不进行数据库更新。
这两种方法中的哪一种是可取的和防错的? 感谢您的见解。
答案 0 :(得分:0)
使用TransactionAttributeType.NEVER
时,事务不会进一步传播。
您可以对返回@Asynchronous
对象的方法使用Future<V>
注释。然后,您可以在对象上调用get(timeout, unit)
以获取等待给定操作时间的结果类型V
,但它是特定于EJB-3.1的。
可以在方法或类级别尝试JBoss特定注释@TransactionTimeout
。也可以在jboss.xml或jboss-service.xml中配置它,具体取决于您的服务器版本。这对于EJB-3.0来说没问题,但是会失去应用程序的可移植性。