5.2. 継続的なクエリーの作成
リモートおよび組み込みキャッシュの継続的なクエリーを作成できます。
手順
-
Query
オブジェクトを作成します。 適切なメソッドを呼び出して、キャッシュの
ContinuousQuery
オブジェクトを取得します。-
リモートキャッシュ:
org.infinispan.client.hotrod.Search.getContinuousQuery(RemoteCache<K, V> cache)
-
埋め込みキャッシュ:
org.infinispan.query.Search.getContinuousQuery(Cache<K, V> cache)
-
リモートキャッシュ:
以下のようにクエリーと
ContinuousQueryListener
オブジェクトを登録します。continuousQuery.addContinuousQueryListener(query, listener);
継続的なクエリーが必要なくなった場合は、以下のようにリスナーを削除します。
continuousQuery.removeContinuousQueryListener(listener);
継続的なクエリーの例
以下のコード例は、組み込みキャッシュを使用した単純な継続的なクエリーを示しています。
この例では、年齢が 21 歳未満の Person
インスタンスがキャッシュに追加されると、リスナーは通知を受け取ります。これらの Person
インスタンスも matches マップに追加されます。エントリーがキャッシュから削除されるか、その年齢が 21 以上になると、matches マップから削除されます。
継続的クエリーの登録
import org.infinispan.query.api.continuous.ContinuousQuery; import org.infinispan.query.api.continuous.ContinuousQueryListener; import org.infinispan.query.Search; import org.infinispan.query.dsl.QueryFactory; import org.infinispan.query.dsl.Query; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; [...] // We have a cache of Person objects. Cache<Integer, Person> cache = ... // Create a ContinuousQuery instance on the cache. ContinuousQuery<Integer, Person> continuousQuery = Search.getContinuousQuery(cache); // Define a query. // In this example, we search for Person instances under 21 years of age. QueryFactory queryFactory = Search.getQueryFactory(cache); Query query = queryFactory.create("FROM Person p WHERE p.age < 21"); final Map<Integer, Person> matches = new ConcurrentHashMap<Integer, Person>(); // Define the ContinuousQueryListener. ContinuousQueryListener<Integer, Person> listener = new ContinuousQueryListener<Integer, Person>() { @Override public void resultJoining(Integer key, Person value) { matches.put(key, value); } @Override public void resultUpdated(Integer key, Person value) { // We do not process this event. } @Override public void resultLeaving(Integer key) { matches.remove(key); } }; // Add the listener and the query. continuousQuery.addContinuousQueryListener(query, listener); [...] // Remove the listener to stop receiving notifications. continuousQuery.removeContinuousQueryListener(listener);