2012-06-17 4 views
20

Glassfish 3.1.2クラスタで動作するJEE6アプリケーションがあります。 @Singleton Beanには、ある種の(readolny)キャッシュが含まれています。ユーザーはGUIのボタンを押して、データベースからの(更新された)コンテンツでキャッシュを更新できます。Glassfish 3.1クラスタ内の(同じ)シングルトンBeanに通知する方法は?

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

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

(私はサポートでは、いくつかのビルドがあると思いますので)私は質問Singleton in Cluster environmentの承知していますが、私の質問はGlassfishのに特異的である、他の1は「Websphereの」とtagedされます。私の質問はJEE6についてですが、もう一つはJEE6より古いです。

+1

あなたが投稿したいと思うかもしれない1つのことは、「どのくらい速く」アップデートが必要なのでしょうか?別名、あなたの必要なトランザクションの分離は何ですか?彼らは他の要求を処理する前に、シングルトンに反映されるように変更を必要としますか?または、数秒以内に数回の通話を処理し、アップデートを受け取ることができますか? –

+0

@exabrial:私のシナリオでは数秒(1..5)でOKです。 – Ralph

+1

これで最善の答えは、JMSのpub/subです。これについては、以下でSam氏が説明します。 MDBにシングルトンへの参照を注入させる。 MDBはトピックに登録する必要があります。メッセージを受け取ったときにシングルトンを更新しますか? –

答えて

10

GlassFish High Availability Administration Guideは、明示的に述べている:へ

  • セッションが失敗し、すべての参照:

    制限事項が

    セッションの持続性とフェールオーバーを設定するには、次 制限に注意してください。開いているファイルやネットワーク接続が失われます。アプリケーションは、この制限を念頭に置いてコーディングする必要があります。

  • EJBシングルトンは、クラスタ内の各サーバーインスタンスに対して作成され、クラスタごとには作成されません。

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

いずれにしても、単一インスタンスから複数インスタンスに移動することは、本当にシームレスな変更ではなく、困難を招くことになります。関連するすべての状態(セッション状態以外)がクラスタ内のすべてのインスタンスに正しく共有されるように、アプリケーションの変更が必要になることがあります。

7

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

アイテムは、他のクラスタに複製されますノード。

3

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

example usage of JGroups hereをチェックアウトすることができます。

関連する問題