Ral*_*lph 20 java synchronization glassfish cluster-computing java-ee
我有一个在Glassfish 3.1.2集群上运行的JEE6应用程序.一个@Singleton Bean包含某种(readolny)缓存.用户可以按下GUI中的按钮,用数据库中的(更新的)内容更新缓存.
这在非集群环境中运行良好,但现在我们需要切换到集群.
所以我面临的问题是,当用户按下该更新按钮时,只更新其服务器节点中的Cache Singleton.我的问题是,让其他Singletons(在其他节点中)更新数据的最简单方法是什么?
我知道群集环境中的Singleton问题,但我的问题是针对Glassfish的(因为我希望有一些内置支持),另一个是用"Websphere"进行分类.我的问题是关于JEE6,另一个比JEE6旧.
Sam*_*erg 10
GlassFish高可用性管理指南明确指出:
限制
配置会话持久性和故障转移时,请注意以下限制:
会话故障转移时,对打开文件或网络连接的任何引用都将丢失.应用程序必须考虑到此限制.
EJB单例是为集群中的每个服务器实例创建的,而不是每个集群创建一次.
另一个建议是使用JMS并按下GUI按钮将消息发布到JMS主题.所有Singleton bean都可以订阅该主题,并且接收消息将使它们几乎同时从数据库更新.这种方法的好处是它可以利用Glassfish的更多内置功能,而不必引入另一个框架.
无论如何,从单个实例迁移到多个实例永远不会是真正无缝的变化,并且会带来一些困难.可能需要进行应用程序更改,以确保所有相关状态(会话状态除外)正确共享到群集中的所有实例.
不幸的是,没有内置的方法来实现你想要的东西,但是Glassfish基于其集群的浅滩框架可以帮助你在这里.您可以通过向集群成员发送通知来更新其缓存或将当前缓存替换为分布式缓存来解决问题.
以下是使用浅滩发送通知的示例:
@Startup
@Singleton
public class Test {
private String groupName = "mygroup";
private String serverName = System.getProperty("HTTP_LISTENER_PORT");
private GroupManagementService gms;
@PostConstruct
public void init() {
    Runnable gmsRunnable = GMSFactory.startGMSModule(serverName, groupName,
            GroupManagementService.MemberType.CORE, null);
    gms = (GroupManagementService) gmsRunnable;
    try {
        gms.join();
        gms.addActionFactory(new MessageActionFactory() {
            @Override
            public Action produceAction() {
                return new MessageAction() {
                    @Override
                    public void consumeSignal(Signal signal)
                            throws ActionException {
                        // Update your cache here
                    }
                };
            }
        }, groupName);
    } catch (GMSException e) {
        Logger.getAnonymousLogger().severe(e.getMessage());
    }
}
@PreDestroy
public void cleanup() {
    gms.shutdown(GMSConstants.shutdownType.INSTANCE_SHUTDOWN);
}
/**
 * Call this from your button click.
 */
public void updateCache() {
    try {
        byte[] message = new byte[] {};
        gms.getGroupHandle().sendMessage(groupName, message);
    } catch (GMSException e) {
        Logger.getAnonymousLogger().severe(e.getMessage());
    }
}
}
如果您想使用分布式缓存:
            DistributedStateCache cache = gms.getGroupHandle().getDistributedStateCache();
放置在缓存中的项目将复制到其他群集节点.
| 归档时间: | 
 | 
| 查看次数: | 2837 次 | 
| 最近记录: |