リーダーシップイベントの取り扱い
エンドポイントのグループは、それぞれリーダーシップの付与または取り消しに基づいて開始および停止できます。これは、共有リソースを単一のインスタンスのみで使用する必要があるクラスター化されたシナリオで役立ちます。この例は、共有ディレクトリをポーリングしているファイル受信チャネルアダプターです。(ファイルを読むを参照)。
リーダー選出に参加し、リーダーが選出されたとき、リーダーシップが取り消されたとき、リーダーになるためのリソースを取得できなかったときに通知を受けるために、アプリケーションは「リーダーイニシエーター」と呼ばれるアプリケーションコンテキスト内にコンポーネントを作成します。通常、リーダーのイニシエーターは SmartLifecycle
であるため、(オプションで) コンテキストの開始時に開始され、リーダーシップが変更されたときに通知を発行します。また、publishFailedEvents
を true
(バージョン 5.0 以降) に設定することで、障害が発生した場合に特定のアクションを実行したい場合に、障害通知を受信することもできます。慣例により、コールバックを受け取る Candidate
を提供する必要があります。フレームワークによって提供される Context
オブジェクトを介してリーダーシップを取り消すこともできます。また、コードは o.s.i.leader.event.AbstractLeaderEvent
インスタンス ( OnGrantedEvent
および OnRevokedEvent
のスーパークラス) をリッスンし、それに応じて (たとえば、SmartLifecycleRoleController
を使用して) 応答することもできます。イベントには、Context
オブジェクトへの参照が含まれています。次のリストは、Context
インターフェースの定義を示しています。
public interface Context {
boolean isLeader();
void yield();
String getRole();
}
バージョン 5.0.6 以降、コンテキストは候補者のロールへの参照を提供します。
Spring Integration は、LockRegistry
抽象化に基づいたリーダーイニシエーターの基本的な実装を提供します。これを使用するには、次の例に示すように、Bean としてインスタンスを作成する必要があります。
@Bean
public LockRegistryLeaderInitiator leaderInitiator(LockRegistry locks) {
return new LockRegistryLeaderInitiator(locks);
}
ロックレジストリが正しく実装されている場合、リーダーは多くても 1 つだけです。ロックレジストリが、期限切れまたは破損時に例外をスローするロック (理想的には InterruptedException
) も提供する場合、リーダーレス期間の期間は、ロックの実装に固有の待ち時間によって許容される限り短くすることができます。デフォルトでは、busyWaitMillis
プロパティは、ロックが不完全な (より一般的な) ケースでの CPU 枯渇を防ぐために、追加のレイテンシーを追加します。
リーダーの選出と Zookeeper を使用するイベントの詳細については、"Zookeeper リーダーシップイベントの取り扱い" を参照してください。リーダーの選出と Hazelcast を使用するイベントの詳細については、"Hazelcast リーダーシップイベントの取り扱い" を参照してください。