【发布时间】: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