5.2. 创建持续查询
您可以为远程和嵌入式缓存创建连续查询。
流程
-
创建
Query
对象。 通过调用适当的方法来获取缓存的 continuous
Query
对象:-
远程缓存:
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
实例也添加到"匹配"映射中。当从缓存中删除条目或其年龄大于或等于 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);