【问题标题】:Singleton on weblogic 10.3weblogic 10.3 上的单例
【发布时间】:2013-01-29 05:43:03
【问题描述】:

我们正在努力寻找在 weblogic 上创建单例的良好解决方案。

现在我们有一个既部署在集群环境中又部署在单个服务器中的耳朵。耳朵内是一个持有某种状态的单身人士。在 2 台服务器上复制该状态会导致不正确的行为。目前,只能通过部署为 max 1 的 MDB 访问该单例。该 MDB 正在侦听一个主题。该主题未分发,这导致我们仅在一台服务器上拥有它,但会导致我们不喜欢的部署警告。

我们考虑了几个解决方案:

  • Weblogic 的 SingletonService。工作正常,但它只在集群上工作,导致应用程序的单服务器版本和开发人员沙箱出现问题。
  • 为单例和周围代码创建一个单独的耳朵,并将其部署在单独的托管服务器上。这有望按要求工作,但需要大量工作才能将我们的单例与周围代码分离,并要求我们向远程访问公开大量功能。
  • 使单例无状态删除单例要求。应该可以工作,但同样需要大量工作

还有其他方法可以解决这个问题吗?也许是一些 JMS 技巧?

【问题讨论】:

  • 澄清:单例是一个事件处理器,其逻辑如下:“每满足 baz 的第 3 个柱执行 foo。计数是它成为单例的要求。foo 和 baz 都需要与系统其他部分的交互

标签: jakarta-ee singleton jms weblogic


【解决方案1】:

Pavel,我看到你自己已经想出了很多好主意。看起来您需要一个单例交叉集群来进行计数。您需要的单例不必是内存中的单例。您可以将计数移动到数据库表中。数据库表可以充当单例。每当计数增加时,您都会调用 jdbc 来更新表中的计数字段。

【讨论】:

    【解决方案2】:

    我不知道我是否非常了解您的问题,也许最简单的解决方案是使主题分布式并使用它将单例状态传播到所有集群节点。

    您可以使用主题来传播单例状态,我的意思是,只有一个单例状态,在需要隐式重新加载的更改或行为上,向主题发送消息,每个 MDB 订阅主题都会收到消息(这里分布式是诀窍)(例如,一个 MDB 用于集群节点)并在每个节点中按您的需要行事。

    希望对您有所帮助,但我不知道我是否理解您的问题。

    【讨论】:

    • 单例中有太多的逻辑需要访问周围的代码,这不是一个简单的解决方案。单例正在处理事件,事件引起的动作取决于系统状态(一堆数据库读取,中间有一些逻辑)。使所有这些检查由 MDB 驱动是可行的,但这需要大量工作并且可能会严重破坏性能
    【解决方案3】:

    【讨论】:

    • 将单例放在共享库中不太可能工作,因为集群中的每个服务器仍然会有一个。但它可能更容易将单例放入非集群服务器,并将单例和其他内容的所有通用代码放入共享库中。我需要玩这个......
    • 您也可以将一致性视为在实例之间共享数据的一种方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    相关资源
    最近更新 更多