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. Query query = cache.query("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);