3.3. リスナーおよび通知
Red Hat Data Grid は、イベントの発生時にクライアントが登録し、通知できるリスナー API を提供します。このアノテーション駆動型APIは、キャッシュレベルイベントとキャッシュマネージャーレベルイベントの2つの異なるレベルに適用されます。
イベントは、リスナーにディスパッチされる通知をトリガーします。リスナーは、@Listener アノテーションが付けられた単純な POJO であり、Listenable インターフェースで定義されたメソッドを使用して登録されます。
CacheとCacheManagerはどちらもListenableを実装しています。つまり、リスナーをキャッシュまたはキャッシュマネージャーのいずれかにアタッチして、キャッシュレベルまたはキャッシュマネージャーレベルのいずれかの通知を受信できます。
たとえば、以下のクラスは、新しいエントリーがキャッシュに追加されるたびに情報を出力するリスナーを定義します。
より包括的な例は、@Listener の Java ドキュメント を参照 してください。
3.3.1. キャッシュレベルの通知 リンクのコピーリンクがクリップボードにコピーされました!
キャッシュレベルのイベントはキャッシュごとに発生し、デフォルトでは、イベントが発生したノードでのみ発生します。分散キャッシュでは、これらのイベントは影響を受けるデータの所有者に対してのみ発生することに注意してください。キャッシュレベルのイベントの例としては、エントリの追加、削除、変更などがあります。これらのイベントは、特定のキャッシュに登録されているリスナーへの通知をトリガーします。
すべての キャッシュレベルの通知の包括的な一覧とメソッドレベルのアノテーションについては、org.infinispan.notifications.cachelistener.annotation パッケージの Javadocs を参照してください。
Red Hat Data Grid で利用可能な キャッシュレベルの通知の一覧は、org.infinispan.notifications.cachelistener.annotation パッケージの Javadocs を参照してください。
3.3.1.1. クラスターリスナー リンクのコピーリンクがクリップボードにコピーされました!
単一ノードでキャッシュイベントをリッスンすることが望ましい場合は、クラスターリスナーを使用する必要があります。
そのために必要なのは、リスナーがクラスター化されているというアノテーションを付けるよう設定することだけです。
@Listener (clustered = true)
public class MyClusterListener { .... }
@Listener (clustered = true)
public class MyClusterListener { .... }
クラスター化されていないリスナーからのクラスターリスナーには、いくつかの制限があります。
-
クラスターリスナーは、
@CacheEntryModified、@CacheEntryCreated、@CacheEntryRemoved、および@CacheEntryExpiredイベントのみをリッスンできます。これは、他のタイプのイベントは、このリスナーに対してリッスンされないことを意味することに注意してください。 - ポストイベントのみがクラスターリスナーに送信され、プレイベントは無視されます。
3.3.1.2. イベントのフィルタリングおよび変換 リンクのコピーリンクがクリップボードにコピーされました!
リスナーがインストールされているノードで適用可能なすべてのイベントがリスナーに発生します。KeyFilter (キーのフィルタリングのみ)または CacheEventFilter (キーのフィルタリングのみを許可する)を使用して、発生したイベントを動的にフィルターすることができます(キー、古いメタデータ、新しい値、新しいメタデータのフィルターに使用され、イベントがイベントの前にある場合(ie. isPre)、コマンドタイプなど、新しいメタデータのフィルターに使用されます。
この例で、イベントがキーOnly Meのエントリーを変更したときにイベントのみを発生させる単純なKeyFilterを示しています。
これは、より効率的な方法で受信するイベントを制限したい場合に便利です。
また、イベントを発生させする前に別の値に値を変換できる CacheEventConverter を指定することもできます。これは、値の変換を行うコードをモジュール化するのに適しています。
上記のフィルターとコンバーターは、クラスターリスナーと組み合わせて使用すると特に効果的です。これは、イベントがリッスンされているノードではなく、イベントが発生したノードでフィルタリングと変換が行われるためです。これにより、クラスター全体でイベントを複製する必要がない(フィルター)、またはペイロードを減らす(コンバーター)という利点があります。
3.3.1.3. 初期状態のイベント リンクのコピーリンクがクリップボードにコピーされました!
リスナーがインストールされると、完全にインストールされた後にのみイベントが通知されます。
リスナーの初回登録時にキャッシュコンテンツの現在の状態を取得することが望ましい場合があります。この場合、キャッシュ内の各要素の @CacheEntryCreated タイプのイベントが生成されます。この最初のフェーズで追加で生成されたイベントは、適切なイベントが発生するまでキューに置かれます。
現時点では、これはクラスター化されたリスナーに対してのみ機能します。ISPN-4608では、クラスター化されていないリスナーへの追加を説明しています。
3.3.1.4. 重複イベント リンクのコピーリンクがクリップボードにコピーされました!
トランザクションではないキャッシュで、重複したイベントを受け取ることが可能です。これは、putなどの書き込み操作の実行中に、キーのプライマリー所有者がダウンした場合に可能になります。
Red Hat Data Grid は、内部で put 操作を指定のキーの新しいプライマリー所有者に送信することで認識します。ただし、書き込みが最初にバックアップに複製されたかどうかについては保証はありません。そのため、CacheEntryCreatedEvent、CacheEntryModifiedEvent、およびCacheEntryRemovedEventの書き込みイベントの 1 つ以上が、1 つの操作で送信される可能性があります。
複数のイベントが生成されると、Red Hat Data Grid はretried コマンドで生成されたイベントを示し、変更の表示に注意せずにこの状況を把握できるようにします。
また、CacheEventFilter または CacheEventConverter を使用する場合は、EventType にメソッド isRetry が含まれ、再試行のためにイベントが生成されたかどうかを指示します。