残念ながら、あなたが望むものを達成するための組み込みの方法はありませんが、Glassfishがそのクラスタリングをベースにしている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();
アイテムは、他のクラスタに複製されますノード。
あなたが投稿したいと思うかもしれない1つのことは、「どのくらい速く」アップデートが必要なのでしょうか?別名、あなたの必要なトランザクションの分離は何ですか?彼らは他の要求を処理する前に、シングルトンに反映されるように変更を必要としますか?または、数秒以内に数回の通話を処理し、アップデートを受け取ることができますか? –
@exabrial:私のシナリオでは数秒(1..5)でOKです。 – Ralph
これで最善の答えは、JMSのpub/subです。これについては、以下でSam氏が説明します。 MDBにシングルトンへの参照を注入させる。 MDBはトピックに登録する必要があります。メッセージを受け取ったときにシングルトンを更新しますか? –