3.3. リスナーおよび通知


Red Hat Data Grid は、イベントの発生時にクライアントが登録し、通知できるリスナー API を提供します。このアノテーション駆動型APIは、キャッシュレベルイベントとキャッシュマネージャーレベルイベントの2つの異なるレベルに適用されます。

イベントは、リスナーにディスパッチされる通知をトリガーします。リスナーは、@Listener アノテーションが付けられた単純な POJO であり、Listenable インターフェースで定義されたメソッドを使用して登録されます。

注記

CacheとCacheManagerはどちらもListenableを実装しています。つまり、リスナーをキャッシュまたはキャッシュマネージャーのいずれかにアタッチして、キャッシュレベルまたはキャッシュマネージャーレベルのいずれかの通知を受信できます。

たとえば、以下のクラスは、新しいエントリーがキャッシュに追加されるたびに情報を出力するリスナーを定義します。

@Listener
public class PrintWhenAdded {

  @CacheEntryCreated
  public void print(CacheEntryCreatedEvent event) {
    System.out.println("New entry " + event.getKey() + " created in the cache");
  }

}
Copy to Clipboard Toggle word wrap

より包括的な例は、@Listener の Java ドキュメント を参照 してください。

3.3.1. キャッシュレベルの通知

キャッシュレベルのイベントはキャッシュごとに発生し、デフォルトでは、イベントが発生したノードでのみ発生します。分散キャッシュでは、これらのイベントは影響を受けるデータの所有者に対してのみ発生することに注意してください。キャッシュレベルのイベントの例としては、エントリの追加、削除、変更などがあります。これらのイベントは、特定のキャッシュに登録されているリスナーへの通知をトリガーします。

すべての キャッシュレベルの通知の包括的な一覧とメソッドレベルのアノテーションについては、org.infinispan.notifications.cachelistener.annotation パッケージの Javadocs を参照してください。

注記

3.3.1.1. クラスターリスナー

単一ノードでキャッシュイベントをリッスンすることが望ましい場合は、クラスターリスナーを使用する必要があります。

そのために必要なのは、リスナーがクラスター化されているというアノテーションを付けるよう設定することだけです。

@Listener (clustered = true)
public class MyClusterListener { .... }
Copy to Clipboard Toggle word wrap

クラスター化されていないリスナーからのクラスターリスナーには、いくつかの制限があります。

  1. クラスターリスナーは、@CacheEntryModified@CacheEntryCreated@CacheEntryRemoved、および @CacheEntryExpired イベントのみをリッスンできます。これは、他のタイプのイベントは、このリスナーに対してリッスンされないことを意味することに注意してください。
  2. ポストイベントのみがクラスターリスナーに送信され、プレイベントは無視されます。

3.3.1.2. イベントのフィルタリングおよび変換

リスナーがインストールされているノードで適用可能なすべてのイベントがリスナーに発生します。KeyFilter (キーのフィルタリングのみ)または CacheEventFilter (キーのフィルタリングのみを許可する)を使用して、発生したイベントを動的にフィルターすることができます(キー、古いメタデータ、新しい値、新しいメタデータのフィルターに使用され、イベントがイベントの前にある場合(ie. isPre)、コマンドタイプなど、新しいメタデータのフィルターに使用されます。

この例で、イベントがキーOnly Meのエントリーを変更したときにイベントのみを発生させる単純なKeyFilterを示しています。

public class SpecificKeyFilter implements KeyFilter<String> {
    private final String keyToAccept;

    public SpecificKeyFilter(String keyToAccept) {
      if (keyToAccept == null) {
        throw new NullPointerException();
      }
      this.keyToAccept = keyToAccept;
    }

    boolean accept(String key) {
      return keyToAccept.equals(key);
    }
}

...
cache.addListener(listener, new SpecificKeyFilter("Only Me"));
...
Copy to Clipboard Toggle word wrap

これは、より効率的な方法で受信するイベントを制限したい場合に便利です。

また、イベントを発生させする前に別の値に値を変換できる CacheEventConverter を指定することもできます。これは、値の変換を行うコードをモジュール化するのに適しています。

注記

上記のフィルターとコンバーターは、クラスターリスナーと組み合わせて使用すると特に効果的です。これは、イベントがリッスンされているノードではなく、イベントが発生したノードでフィルタリングと変換が行われるためです。これにより、クラスター全体でイベントを複製する必要がない(フィルター)、またはペイロードを減らす(コンバーター)という利点があります。

3.3.1.3. 初期状態のイベント

リスナーがインストールされると、完全にインストールされた後にのみイベントが通知されます。

リスナーの初回登録時にキャッシュコンテンツの現在の状態を取得することが望ましい場合があります。この場合、キャッシュ内の各要素の @CacheEntryCreated タイプのイベントが生成されます。この最初のフェーズで追加で生成されたイベントは、適切なイベントが発生するまでキューに置かれます。

注記

現時点では、これはクラスター化されたリスナーに対してのみ機能します。ISPN-4608では、クラスター化されていないリスナーへの追加を説明しています。

3.3.1.4. 重複イベント

トランザクションではないキャッシュで、重複したイベントを受け取ることが可能です。これは、putなどの書き込み操作の実行中に、キーのプライマリー所有者がダウンした場合に可能になります。

Red Hat Data Grid は、内部で put 操作を指定のキーの新しいプライマリー所有者に送信することで認識します。ただし、書き込みが最初にバックアップに複製されたかどうかについては保証はありません。そのため、CacheEntryCreatedEventCacheEntryModifiedEvent、およびCacheEntryRemovedEventの書き込みイベントの 1 つ以上が、1 つの操作で送信される可能性があります。

複数のイベントが生成されると、Red Hat Data Grid はretried コマンドで生成されたイベントを示し、変更の表示に注意せずにこの状況を把握できるようにします。

@Listener
public class MyRetryListener {
  @CacheEntryModified
  public void entryModified(CacheEntryModifiedEvent event) {
    if (event.isCommandRetried()) {
      // Do something
    }
  }
}
Copy to Clipboard Toggle word wrap

また、CacheEventFilter または CacheEventConverter を使用する場合は、EventType にメソッド isRetry が含まれ、再試行のためにイベントが生成されたかどうかを指示します。

Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2026 Red Hat
トップに戻る