SFSB 在 SLSB 中使用@Asynchronous 方法
SFSB In SLSB with @Asynchronous Method
我想知道这里是否有人可以回答我的问题,因为我已经在互联网上搜索了一段时间了。我了解到,将 SFSB 注入 SLSB 时,您可以获得 "unexpected results"。我的理解是这是因为从 SLSB 到 SFSB 时事务状态丢失了。
我的问题是,如果我有一个无状态 bean,它只有一个异步业务方法,其中使用了注入的有状态 EJB,那么我的缺点和可能是什么 "unexpected results?"
根据我的理解,当调用异步方法并从另一个 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出于同样的原因有状态,我失去了异步功能,一切都是同步发生的。
提前致谢。
- 将 SFSB 注入 SLSB 的缺点是每次调用 SLSB 都可能调用它的不同实例,该实例具有不同的 SFSB 实例(具有不同的状态)注入其中。这似乎会产生 "unexpected results".
- 您对事务状态 "is lost" 的理解有些谬误。状态丢失是因为上面的第 1 项,而不是因为事务不稳定。
您可以通过 @Singleton
委托给您的 SFSB。这样您就可以保证每次都获得相同的 SFSB。
我想知道这里是否有人可以回答我的问题,因为我已经在互联网上搜索了一段时间了。我了解到,将 SFSB 注入 SLSB 时,您可以获得 "unexpected results"。我的理解是这是因为从 SLSB 到 SFSB 时事务状态丢失了。
我的问题是,如果我有一个无状态 bean,它只有一个异步业务方法,其中使用了注入的有状态 EJB,那么我的缺点和可能是什么 "unexpected results?"
根据我的理解,当调用异步方法并从另一个 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出于同样的原因有状态,我失去了异步功能,一切都是同步发生的。
提前致谢。
- 将 SFSB 注入 SLSB 的缺点是每次调用 SLSB 都可能调用它的不同实例,该实例具有不同的 SFSB 实例(具有不同的状态)注入其中。这似乎会产生 "unexpected results".
- 您对事务状态 "is lost" 的理解有些谬误。状态丢失是因为上面的第 1 项,而不是因为事务不稳定。
您可以通过 @Singleton
委托给您的 SFSB。这样您就可以保证每次都获得相同的 SFSB。