【问题标题】:What happens when stateful bean is destroyed during @Asynchronous method call?在 @Asynchronous 方法调用期间销毁有状态 bean 会发生什么?
【发布时间】:2014-01-19 09:25:53
【问题描述】:

我有一个有状态的 EJB,它带有一个返回 Future<T> 的事务性 @Asynchronous 方法。它是从 web 层 (@SessionScoped CDI 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() {
  //
  }

}

问题是如果用户在执行此异步调用期间终止 Web 会话,事务会发生什么?

【问题讨论】:

    标签: jakarta-ee ejb ejb-3.0 java-ee-7


    【解决方案1】:

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

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

    如果你只执行 Async 方法 - 没有 get()- ,该方法将被排队和处理,那么,同样适用......有状态销毁。

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

    总而言之,因为发生了新事务,控制权立即返回给客户端(除非调用get()),正常情况下事务无异常完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-22
      • 1970-01-01
      • 1970-01-01
      • 2015-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多