残念ながら、あなたが望むものを達成する組み込みの方法はありませんが、Glassfish がそのクラスタリングの基礎としている shoal フレームワークは、ここであなたを助けることができます. この問題は、クラスター メンバーに通知を送信してキャッシュを更新するか、現在のキャッシュを分散キャッシュに置き換えることで解決できます。
以下は、shoal を使用して通知を送信する例です。
@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();
キャッシュに配置されたアイテムは、他のクラスター ノードにレプリケートされます。