20

Glassfish 3.1.2 クラスターで実行される JEE6 アプリケーションがあります。1 つの @Singleton Bean には、ある種の (readolny) キャッシュが含まれています。ユーザーは GUI のボタンを押して、データベースの (更新された) コンテンツでキャッシュを更新できます。

これはクラスタ化されていない環境ではうまく機能しますが、今度はクラスタに切り替える必要があります。

そのため、ユーザーがその更新ボタンを押すと、サーバーノードのキャッシュシングルトンのみが更新されるという問題に直面しています。私の質問は、他のシングルトン (他のノード内) にデータを更新させる最も簡単な方法は何でしょうか?

クラスター環境でのシングルトンの質問は承知していますが、私の質問は Glassfish に固有のものであり (サポートが組み込まれていることを願っているため)、もう 1 つの質問には「Websphere」というタグが付けられています。そして、私の質問は JEE6 についてです。もう 1 つは JEE6 よりも古いものです。

4

3 に答える 3

10

GlassFish High Availability Administration Guideには、次のように明示的に記載されています。

制限

セッションの永続性とフェイルオーバーを構成するときは、次の制限に注意してください。

  • セッションがフェイルオーバーすると、開いているファイルまたはネットワーク接続への参照がすべて失われます。アプリケーションは、この制限を念頭に置いてコーディングする必要があります。

  • EJB シングルトンは、クラスターごとに 1 回ではなく、クラスター内のサーバー インスタンスごとに作成されます。

もう 1 つの提案は、JMSを使用し、GUI ボタン​​を押してメッセージを JMS トピックにポストすることです。すべてのシングルトン Bean はそのトピックにサブスクライブでき、メッセージを受信すると、それらすべてがデータベースからほぼ同時に更新されます。このアプローチの利点は、必ずしも別のフレームワークを導入する必要なく、Glassfish の組み込み機能をより多く活用できることです。

いずれにせよ、単一インスタンスから複数インスタンスへの移行は真にシームレスな変更ではなく、多少の困難が生じるでしょう。関連するすべての状態 (セッション状態以外) がクラスター内のすべてのインスタンスに正しく共有されるようにするには、アプリケーションの変更が必要になる可能性があります。

于 2012-06-20T14:13:40.560 に答える
7

残念ながら、あなたが望むものを達成する組み込みの方法はありませんが、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();

キャッシュに配置されたアイテムは、他のクラスター ノードにレプリケートされます。

于 2012-06-19T11:44:35.513 に答える
3

をご覧くださいJGroups。信頼性の高いマルチキャスト通信のためのフレームフォークです。JBoss クラスタリング メカニズムは現在、このツールに基づいています。

hereの使用例JGroupsを確認できます。

于 2012-06-20T12:40:16.373 に答える