java - 为什么 EJB 定时器服务使用 Singleton 作为标准?

标签 java timer singleton ejb stateless

我最近一直在研究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/

相关文章:

ios - 如何使 Swift Class Singleton 实例线程安全?

c# - 从类访问 C# 单例而不将其传递到类中

c++ - 共享库中静态对象的销毁顺序

java - 如何分别为Nexus4 和Galaxy Nexus 布局?

java - 在 JFrame 内布局 JPanel

user-interface - 在脚本运行时刷新表单上的数据的后台作业?

linux - 使用 glibc 定时器时出现段错误

java - 使用JavaCompiler编译代码时如何设置.class文件夹路径?

java - 使用 Xuggler 解码大型音频文件

ios - 当用户拖动和/或缩放时,iOS 5 上的 MKMapView 会禁止计时器