我有一个在 Glassfish 3.1.2 集群上运行的 JEE6 应用程序。 一个@Singleton Bean 包含某种(readolny)缓存。用户可以按下 GUI 中的按钮以使用数据库中的(更新的)内容更新缓存。
这在非集群环境中运行良好,但现在我们需要切换到集群。
所以我面临的问题是,当用户按下更新按钮时,只有来自他的服务器节点的缓存单例被更新。我的问题是,让其他单例(在其他节点中)也更新那里的数据的最简单方法是什么?
我知道问题 Singleton in Cluster environment ,但我的问题是针对 Glassfish 的(因为我希望有一些内置支持),另一个问题是用“Websphere”标记的。我的问题是关于 JEE6,另一个比 JEE6 更老。
最佳答案
GlassFish High Availability Administration Guide明确指出:
Restrictions
When configuring session persistence and failover, note the following restrictions:
When a session fails over, any references to open files or network connections are lost. Applications must be coded with this restriction in mind.
EJB Singletons are created for each server instance in a cluster, and not once per cluster.
另一个建议是使用 JMS 并按下 GUI 按钮向 JMS 主题发布消息。所有 Singleton bean 都可以订阅该主题,并且接收消息将导致它们几乎同时从数据库中更新。这种方法的好处是,它利用了 Glassfish 的更多内置功能,而不必引入另一个框架。
无论如何,从单实例迁移到多实例从来都不是真正的无缝更改,而且会带来一些困难。可能需要对应用程序进行更改,以确保所有相关状态( session 状态除外)都正确共享给集群中的所有实例。
关于java - 如何通知 Glassfish 3.1 集群中的所有(相同)单例 bean ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11070116/