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ドキュメントを参照してください。