我最近一直在研究ejb,我也在阅读有关定时器服务的内容,但是即使我已经阅读了无状态、有状态和单例类型的 session Bean,我仍然很难弄清楚是什么让定时器成为服务具有多实例属性。
我看过一些例子,即使是最简单的例子也使用单例 session Bean,所以,如果我要编写一个简单的程序来测试它,可以使用无状态 Bean 还是建议使用一个单例呢?另外,如果可能的话,我可以遇到无状态不是最优的情况吗?
最佳答案
如果要确保所有超时回调都在同一个底层 bean 实例上调用,请使用单例。如果你想在 bean 实例本身维护状态,并且你想确保一次只能调用一个超时回调,这一点很重要(默认情况下,超时回调将使用单例的并发管理设置,默认情况下是具有写锁的容器管理,因此一次只能调用单例上的一个方法。
如果你想允许一次调用多个超时回调,请使用无状态。如果同时发生多个超时回调,EJB 容器将创建新的 bean 实例。
如果你想配置一个非持久计时器在应用程序开始运行时开始运行,那么你可以在无状态或单例 bean 上使用 @Schedule 注释,或者你可以使用 @Singleton @Startup bean @PostConstruct(如果你想要无状态行为,你可以将无状态 bean 注入(inject)无状态 bean 并在启动期间在无状态 session bean 上调用 createTimer)。
关于java - 为什么 EJB 定时器服务使用 Singleton 作为标准?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37731197/