在@Asynchronous方法调用期间销毁有状态bean会发生什么?

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会话,事务会发生什么?

Ser*_*gio 1

@Asynchronous方法创建一个新事务(即使该类有另一个属性,也会TransactionAttributeType.REQUIRED创建一个新事务)。

现在,如果您在线程get()中调用方法,将等待直到 AsyncResult 在计算结束时变得可用。Future<V>之后,Stateful就可以执行超时,并被容器销毁。

如果你只是执行异步方法 - 没有get()- ,该方法将被排队并处理,然后,同样适用......有状态销毁。

专业提示:ejb 容器将完整异步调用的结果值维护一段时间(规范中未定义该时间)。

总而言之,由于发生了新的事务,并且控制权立即返回给客户端(除非调用get()),因此在正常情况下事务不会出现异常。