件名は質問です。
シナリオ : ログアウト リンクがあっても、一部のユーザーが正しくログアウトしません。そしてすぐに新しいタブを開き、再度ログインします。今回は、新しい Cache オブジェクトが作成され、古いオブジェクトは破棄されません。
件名は質問です。
シナリオ : ログアウト リンクがあっても、一部のユーザーが正しくログアウトしません。そしてすぐに新しいタブを開き、再度ログインします。今回は、新しい Cache オブジェクトが作成され、古いオブジェクトは破棄されません。
まず、デフォルトを設定する lifespan
かmaxIdle
、すべてのエンティティをタイムアウトにして、エンティティが長期間古くならないようにすることができます。
ただし、質問に答えるには...infinispan-query
モジュールを使用できます。
<dependency>
<groupId>org.infinispan</groupId>
<artifactId>infinispan-query</artifactId>
<version>5.2.1.Final</version>
</dependency>
これは、hibernate search と apache lucene を使用して、インフィニスパン キャッシュをクエリします。
これを使用するには、検索するフィールドに で注釈を付け@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();
}