主题是问题。
场景:即使存在注销链接,某些用户也无法正常注销。他们立即采用新标签并再次登录。这次创建了一个新的Cache对象,旧的Cache对象没有被销毁。
答案 0 :(得分:0)
首先,您可以set a default lifespan
或maxIdle
让所有实体超时,这样他们就不会长时间保持陈旧。
但是,要回答您的问题......您可以使用infinispan-query
模块:
<dependency>
<groupId>org.infinispan</groupId>
<artifactId>infinispan-query</artifactId>
<version>5.2.1.Final</version>
</dependency>
这使用hibernate搜索和apache lucene来查询你的infinispan缓存。
要使用此功能,您需要使用@org.hibernate.search.annotations.Field
和带@org.hibernate.search.annotations.Indexed
的课程注释要搜索的字段。
您的infinispan缓存还需要编入索引<indexing enabled="true" indexLocalOnly="false" />
(本地或分布式 - 请参阅indexLocalOnly
属性)。
然后您可以使用以下内容查询缓存:
import org.apache.lucene.search.Query;
import org.hibernate.search.query.dsl.QueryBuilder;
import org.infinispan.Cache;
import org.infinispan.query.CacheQuery;
import org.infinispan.query.Search;
import org.infinispan.query.SearchManager;
[...]
public List<YourEntity> searchEntities( String fieldValue ) {
SearchManager searchManager = Search.getSearchManager( cache );
QueryBuilder queryBuilder = searchManager.buildQueryBuilderForClass( YourEntity.class ).get();
// this chain will change depending on what you are querying
Query luceneQuery = queryBuilder.keyword().onField( "fieldName" ).matching( fieldValue ).createQuery();
// use either searchManager.getClusteredQuery with local index, or a searchManager.getQuery with clustered index
CacheQuery cacheQuery = searchManager.getQuery( luceneQuery, YourEntity.class );
//noinspection unchecked
return (List)cacheQuery.list();
}