【问题标题】:SFSB In SLSB with @Asynchronous MethodSFSB 在 SLSB 中使用 @Asynchronous 方法
【发布时间】:2016-04-28 19:58:33
【问题描述】:

我想知道这里是否有人可以回答我的问题,因为我已经在互联网上搜索了一段时间了。我了解将 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 有状态,我失去了异步功能,一切都是同步发生的。

提前致谢。

【问题讨论】:

  • 为什么在 SLSB 中需要 SFSB? SLSB 不知道要注入哪个 SFSB(许多用户/客户端),并且您不会在 SFSB 中使用任何“状态”。
  • 在@Async 方法的调用之间不需要状态。只是方法内的稳定状态。
  • 看来LowerBusinessBean 应该是@Singleton
  • 好主意,但遗憾的是它是一个被更大框架暴露的 bean,我正在挂钩,我无法更改。

标签: jakarta-ee asynchronous glassfish ejb


【解决方案1】:
  1. 将 SFSB 注入 SLSB 的不利之处在于,每次调用 SLSB 都可能调用它的不同实例,该实例中注入了不同的 SFSB 实例(具有不同的状态)。这似乎会产生“意想不到的结果”。
  2. 您对事务状态“丢失”的理解有些错误。状态丢失是因为上面的第 1 项,而不是因为事务不稳定。

您可以通过@Singleton 委托给您的 SFSB。这样您就可以保证每次都获得相同的 SFSB。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    相关资源
    最近更新 更多