この章では、プログラムによるクラスタ内のメンバーおよびサービスの管理方法とメンバーおよびサービスのイベントのリスニング方法について説明します。
この章には次の項が含まれます:
Coherenceでは、新しいサーバーの起動時にそれらのサーバーをクラスタに自動的に追加し、シャットダウンまたは障害の発生時にそれらのサーバーの離脱を自動的に検出することによって、クラスタ・メンバーシップを管理します。アプリケーションはこの情報への完全なアクセスが許可されており、メンバーがクラスタに参加したり、クラスタから離脱した際にイベント通知を受信するようにサインアップできます。Coherenceでは、メンバーのそれぞれが提供および使用するすべてのサービスも追跡されます。この情報は、サーバーに障害が発生した場合のサービスの回復計画およびクラスタのすべてのメンバーにわたるデータ管理の負荷分散に多用されます。
アプリケーションは、任意のキャッシュからキャッシュのサービスのローカル表現への参照を取得できます。また、任意のサービスからクラスタのローカル表現への参照を取得することもできます。
CacheService service = cache.getCacheService(); Cluster cluster = service.getCluster();
Cluster
オブジェクトで、クラスタ内で実行されているサービス・セットを確認できます。例9-1で説明します。
例9-1 クラスタ内で実行されているサービスの確認
... for (Enumeration enum = cluster.getServiceNames(); enum.hasMoreElements(); ) { String sName = (String) enum.nextElement(); ServiceInfo info = cluster.getServiceInfo(sName); // ... } ...
ServiceInfo
オブジェクトは、名前、タイプ、バージョン、メンバーシップなどの情報を提供します。
この機能の詳細は、NamedCache
、CacheService
、Service
、ServiceInfo
およびCluster
のAPIドキュメントを参照してください。
アプリケーションでクラスタ内の各メンバーに関して確認できる主な情報は次のとおりです。
メンバーのIPアドレス
メンバーがクラスタに参加した日付/時刻
たとえば、クラスタに4つのサーバーがあり、各サーバーでアプリケーションのコピー(インスタンス)が1つ実行されていて、アプリケーションの4つのインスタンスすべてがクラスタ化されているとします。この場合、そのクラスタは4つのメンバーで構成されます。アプリケーションでは、次のようにCluster
オブジェクトからローカルのMember
を確認できます。
Member memberThis = cluster.getLocalMember();
また、Cluster
オブジェクトから、クラスタ・メンバーの全体セットを確認することもできます。
Set setMembers = cluster.getMemberSet();
ServiceInfo
オブジェクトで、そのサービスに参加しているクラスタ・メンバー・セットを確認できます。
ServiceInfo info = cluster.getServiceInfo(sName); Set setMembers = info.getMemberSet();
この機能の詳細は、Member
のAPIドキュメントを参照してください。
クラスタおよびサービスのメンバーシップの変更をリスニングするには、アプリケーションで、MemberListener
インタフェース(「例9-2」を参照)を実装するクラスを作成する必要があります。作成したリスナー・クラスは、サービスのaddMemberListener
メソッドを使用するか、キャッシュ・スキーム定義に<member-listener>
要素を追加することによって、サービスに追加されます。
プログラムを使用する方法と比較して、構成を使用する方法には次の2つの利点があります。第1に、プログラムを使用した場合は、実行中のサービスにのみリスナーを追加できます。そのため、最初のMEMBER_JOINED
イベントが見逃されます。第2に、対応するサービスを実行するすべてのクラスタ・ノードのそれぞれで、addMemberListener
コールを発行する必要があります。構成による方法では、これら両方の問題が解決されます。
次の例では、addMemberListener
メソッドを使用して、サービスにMyMemberListener
という名前のリスナー実装を追加します。
Service service = cache.getCacheService(); service.addMemberListener(package.MyMemberListener);
このサービスは、名前で検索することもできます。
Service service = cluster.getService(sName); service.addMemberListener(package.MyMemberListener);
次の例では、<member-listener>
要素を分散キャッシュ・スキーム定義に追加することによって、MyMemberListener
という名前のリスナー実装をDistributedCache
という名前のサービスに追加します。
<distributed-scheme> <scheme-name>example-distributed</scheme-name> <service-name>DistributedCache</service-name> <member-listener> <class-name>package.MyMemberListener</class-name> </member-listener> <backing-map-scheme> <local-scheme> <scheme-ref>example-binary-backing-map</scheme-ref> </local-scheme> </backing-map-scheme> <autostart>true</autostart> </distributed-scheme>
<member-listener>
要素は、<distributed-scheme>
、<replicated-scheme>
、<optimistic-scheme>
、<invocation-scheme>
および<proxy-scheme>
の各要素で使用できます。有効なキャッシュ構成要素のリファレンスについては、付録B「キャッシュ構成の要素」を参照してください。
注意: <member-listener> 要素を使用してリスナーをサービスに追加する場合は、MemberListener 実装にパブリック・デフォルト・コンストラクタが必要です。 |
例9-2は、受信したすべてのメンバーシップ・イベントを出力するMemberListener
実装を示しています。
例9-2 MemberListener実装のサンプル
public class MemberEventPrinter extends Base implements MemberListener { public void memberJoined(MemberEvent evt) { out(evt); } public void memberLeaving(MemberEvent evt) { out(evt); } public void memberLeft(MemberEvent evt) { out(evt); } }
MemberEvent
オブジェクトは、イベント・タイプ(MEMBER_JOINED
、MEMBER_LEAVING
またはMEMBER_LEFT
)、イベントを生成したメンバー、およびイベントのソースとして動作するサービスについての情報を保持します。また、イベントにはisLocal()
メソッドが用意されており、これは対象のメンバーがクラスタに参加または離脱しようとしていることをアプリケーションに示します。これは、障害の発生後にアプリケーションがクラスタに自動的に参加しなおす、ソフトな再起動の認識に役立ちます。
注意: CacheFactory.shutdown() メソッドをコールすると、すべてのリスナーが登録解除されます。その場合、MEMBER_LEAVING とMEMBER_LEFT の両方のイベントが送信されます。その他の原因でメンバーが終了した場合は、MEMBER_LEFT イベントのみが送信されます。 |
例9-3は、MemberEvent
オブジェクトでカプセル化された情報の使用方法を示しています。
例9-3 MemberEventオブジェクトのイベント・タイプ情報の使用
public class RejoinEventPrinter extends Base implements MemberListener { public void memberJoined(MemberEvent evt) { if (evt.isLocal()) { out("this member just rejoined the cluster: " + evt); } } public void memberLeaving(MemberEvent evt) { } public void memberLeft(MemberEvent evt) { } }
これらの機能の詳細は、Service
、MemberListener
およびMemberEvent
のAPIドキュメントを参照してください。