使用@Asynchronous方法

时间:2016-04-28 19:58:34

标签: java-ee asynchronous glassfish ejb

我想知道这里是否有人可以回答我的问题,因为我一直在网上搜索这些东西已经有一段时间了。我知道在将SFSB注入SLSB时可能会出现“意外结果”。我的理解是因为从SLSB到SFSB时交易状态丢失了。

我的问题是,如果我有一个只有一个异步业务方法的无状态bean,其中使用了一个注入的有状态EJB,那么我的缺点和可能的“意外结果是什么?”

根据我的理解,当调用异步方法并从另一个bean中分离出来时,事务状态仍会丢失,只有安全信息从上面传递给异步方法。因此,如果SFSB仅用于一个@Asynchronus方法,我可以将SFSB注入我的SLSB吗?我在这里错过了什么?

简化代码示例:

@Stateless
public class SeedValuesBean {
  /**
  * Async action bean.
  */
 @EJB
 private SeedValuesAsyncBean asyncBean;

 public void performSeedValues() {
   Future<String> result = asyncBean.seedValues():
   logger.info("Result :"+ result.get());
  }
}

@Stateless
public class SeedValuesAsyncBean {

 @EJB
 private LowerBusinessBean lowerBean;  // is stateful

 @Asynchronous
 public Future<String> seedValues() {
    return new AsyncResult<>(lowerBean.getResult());
 }
}

@Stateful
public class LowerBusinessBean {
  public String getResult() {
    return Double.toString(Math.random());  
  }
}

对于上下文我问,因为如果我使 SeedValuesAsyncBean 有状态(所以我可以注入一个有状态的bean而不是违反代码),然后因为同样的原因使 SeedValuesBean 有状态,我失去了异步功能,一切都同步发生。

提前致谢。

1 个答案:

答案 0 :(得分:1)

  1. 将SFSB注入SLSB的缺点是,每次调用SLSB都可能会调用其中注入了不同SFSB实例(具有不同状态)的不同实例。这似乎会产生意外结果&#34;。
  2. 您了解交易状态&#34;已丢失&#34;有点谬误。由于上述第1项,状态丢失,而不是因为交易不稳定。
  3. 您可以通过@Singleton委托给您的SFSB。然后,您将确保每次都获得相同的SFSB。