如何在群集环境中使用javax.ejb.Singleton?

我需要在应用程序中维护一个对于集群环境中的所有用户和所有节点都是唯一的简单计数器。 我想过如下使用单例会话bean注释javax.ejb.Singleton:

package foo; import javax.ejb.Singleton; @Singleton public class Bean { private int counter; [...] } 

这看起来很简单,但如果在集群环境中按预期工作,我找不到答案。 群集的每个节点都有自己的实例吗?

当然,我可以将bean保存在数据库中,但它实际上只是一个计数器,这样做会有点过分。 此外,我希望计数器在应用程序崩溃或重新启动时重置,因此持久存在会产生比解决的问题更多的问题。

群集的每个节点都有自己的实例吗?

是的,每个群集节点将具有不同的Singleton实例。 因此,@ Singleton注释不是您的问题的解决方案。

请记住,Java EE规范没有定义任何类型的集群行为。 您需要搜索特定的供应商解决方案才能实现此类要求。 仅作为示例,请参阅此链接 。

你可以使用hazelcast 。 它是一个分布式内存键值存储。 似乎它将是一个完美的契合。 它还实现了JSR-107,这是JCache规范。

哈单身是一种方法。 作为进步,存在一些局限性。 如果您阅读,您将拥有一个通过“getValue()”方法访问服务的@stateless bean。 get值调用singleton bean的方法并给你一个值……直到那里。

但是如果你需要使用bean操作,策略应该通过get值返回一个SingletonBean实例,但是……你将有更多的单例bean实例….并且存在问题。