2016-06-09 59 views
3

我最近一直在研究ejb,我也在阅读有关定时器服务的内容,但即使我已阅读了关于无状态,有状态和Singleton类型的会话Bean,但仍然有一些问题需要弄清楚定时器服务有一个多实例属性。为什么EJB计时器服务使用Singleton作为标准?

我已经看到了一些例子,甚至最简单的使用Singleton会话Bean,所以,如果我要编写一个简单的程序来测试它,可以使用无状态Bean或建议无论如何使用单身?另外,如果可能的话,我是否可以有无状态不是最佳的情况?

回答

0

它采用单身的原因是至少2倍:

1.

只有单身有启动初始化的能力。这意味着,您可以在应用程序启动时注册您的计时器服务。

2.

,如果它是使用无状态bean,然后一个新的计时器服务将与每一个无状态的bean设置服务请求注册。单身保证只有一种你的计时器被注册。想象一下,如果您无意中在无状态bean中使用计时器,则会出现争用或完整性问题或资金损失,然后在大致相同的时间创建1个以上的服务请求。

1

如果要确保在同一个基础bean实例上调用所有超时回调,请使用单例。如果要在Bean实例本身中维护状态,并且要确保一次只能调用一个超时回调(默认情况下,超时回调将使用单例的并发管理设置,默认情况下为容器管理与一个写锁,所以一次只能调用一个单例方法)。

如果您想允许一次调用多个超时回调,请使用无状态。如果同时发生多个超时回调,EJB容器将创建新的bean实例。

如果您希望配置非持久性计时器以在应用程序开始运行时开始运行,那么您既可以对无状态bean也可以使用@Schedule注释,也可以使用@Singleton @Startup bean与@PostConstruct(如果你想要无状态行为,你可以将无状态bean注入到无状态bean中,并在启动时在无状态会话bean上调用createTimer)。

相关问题