如何找到陈旧的Infinispan / Jboss Cache对象?

时间:2013-03-13 04:29:00

标签: caching jboss jboss5.x infinispan

主题是问题。

场景:即使存在注销链接,某些用户也无法正常注销。他们立即采用新标签并再次登录。这次创建了一个新的Cache对象,旧的Cache对象没有被销毁。

1 个答案:

答案 0 :(得分:0)

首先,您可以set a default lifespanmaxIdle让所有实体超时,这样他们就不会长时间保持陈旧。

但是,要回答您的问题......您可以使用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();
}