【问题标题】:Why does the EJB Timer Service use Singleton as standard?为什么 EJB Timer Service 使用 Singleton 作为标准?
【发布时间】:2016-10-10 09:58:33
【问题描述】:

我最近一直在学习 ejb,并且我也在阅读有关计时器服务的内容,但是即使我已经阅读了有关无状态、有状态和单例类型的会话 Bean,我仍然很难弄清楚是什么使计时器服务具有多实例属性。

我看到了一些例子,即使是最简单的也使用Singleton Session Bean,所以,如果我要编写一个简单的程序来测试它,是否可以使用Stateless Bean 或者推荐使用一个单身汉吗?另外,如果可能的话,我是否可以遇到 Stateless 不是最优的情况?

【问题讨论】:

    标签: java timer singleton ejb stateless


    【解决方案1】:

    如果您想确保在同一个底层 bean 实例上调用所有超时回调,请使用单例。如果要在 bean 实例本身中维护状态,并且要确保一次只能调用一个超时回调,这很重要(默认情况下,超时回调将使用单例的并发管理设置,默认情况下是使用写锁进行容器管理,因此一次只能调用单例上的一个方法。

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

    如果您想配置一个非持久性计时器以在应用程序开始运行时开始运行,那么您可以在无状态或单例 bean 上使用 @Schedule 注释,或者您可以使用 @Singleton @Startup bean一个@PostConstruct(如果你想要无状态行为,你可以将无状态bean注入无状态bean并在启动期间在无状态会话bean上调用createTimer)。

    【讨论】:

      【解决方案2】:

      它使用单例的原因至少有 2 倍:

      1.

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

      2.

      如果要使用无状态 bean,那么每个无状态 bean 设置都会注册一个新的计时器服务来服务请求。单例保证只有一种计时器被注册。想象一下,如果您无意中在无状态 bean 中使用了一个计时器,然后或多或少地同时创建了多个 1 来服务请求,那么就会出现争用或完整性问题或金钱损失。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-20
        • 2011-04-16
        • 2011-08-21
        相关资源
        最近更新 更多