我最近一直在研究ejb,我也在阅读有关定时器服务的内容,但即使我读过有关Stateless,Stateful和Singleton类型的会话Bean,我仍然有一些麻烦来弄清楚是什么让定时器服务具有多实例属性。
我已经看过一些例子,即使是最简单的例子也使用Singleton Session Bean,所以,如果我要编写一个简单的程序来测试它,可以使用无状态Bean,还是建议使用它一个单身人士呢?另外,如果可能的话,我是否可以遇到无状态不是最优的情况?
答案 0 :(得分:1)
如果要确保在同一底层bean实例上调用所有超时回调,请使用单例。如果你想在bean实例本身维护状态,并且你想确保一次只能调用一个超时回调(默认情况下,超时回调将使用单例的并发管理设置,默认情况下是使用写锁定进行容器管理,因此一次只能调用单例上的一个方法。
如果要允许一次调用多个超时回调,请使用无状态。如果同时发生多个超时回调,EJB容器将创建新的bean实例。
如果要将非持久性计时器配置为在应用程序开始运行时开始运行,则可以在无状态bean或单例bean上使用@Schedule注释,也可以使用@Singleton @Startup bean @PostConstruct(如果你想要无状态行为,你可以将无状态bean注入无状态bean并在启动期间在无状态会话bean上调用createTimer。)
答案 1 :(得分:0)
它使用单身的原因至少是2倍:
1
只有单身人士才具备启动初始化的能力。这意味着,您可以在应用程序启动时注册计时器服务。
2
如果它是使用无状态bean,那么将在每个无状态bean设置中注册一个新的计时器服务来提供请求。单例保证只注册一种计时器中的一种。想象一下争用或完整性问题或资金损失,如果你无意中在无状态bean中使用了一个计时器,那么就会在或多或少同时创建一个以上的服务请求。