Osw*_*Osw 5 ejb java-ee ejb-3.0 java-ee-7
我有一个有状态的EJB,@Asynchronous返回一个事务方法Future<T>.它是从Web层(@SessionScopedCDI bean)调用的,如下所示:
@SessionScoped
@Named
public class SessionBean {
@EJB
EjbService service
public void call() {
Future<Object> response = service.process();
}
}
@Stateful
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class EjbService {
@Asynchronous
public Future<Object> process() {
//
}
}
Run Code Online (Sandbox Code Playgroud)
问题是如果用户在执行此异步调用期间终止Web会话,事务会发生什么?
该@Asynchronous方法创建一个新事务(即使该类有另一个属性,也会TransactionAttributeType.REQUIRED创建一个新事务)。
现在,如果您在线程get()中调用方法,将等待直到 AsyncResult 在计算结束时变得可用。Future<V>之后,Stateful就可以执行超时,并被容器销毁。
如果你只是执行异步方法 - 没有get()- ,该方法将被排队并处理,然后,同样适用......有状态销毁。
专业提示:ejb 容器将完整异步调用的结果值维护一段时间(规范中未定义该时间)。
总而言之,由于发生了新的事务,并且控制权立即返回给客户端(除非调用get()),因此在正常情况下事务不会出现异常。
| 归档时间: |
|
| 查看次数: |
494 次 |
| 最近记录: |