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
实例也添加到"匹配"映射中。当从缓存中删除条目或其年龄大于或等于 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);