package org.infinispan.eviction.impl; import java.util.Map; import org.infinispan.configuration.cache.Configuration; import org.infinispan.container.entries.InternalCacheEntry; import org.infinispan.context.InvocationContext; import org.infinispan.context.impl.ImmutableContext; import org.infinispan.eviction.EvictionManager; import org.infinispan.factories.annotations.Inject; import org.infinispan.interceptors.AsyncInterceptorChain; import org.infinispan.interceptors.impl.CacheMgmtInterceptor; import org.infinispan.notifications.cachelistener.CacheNotifier; import net.jcip.annotations.ThreadSafe; @ThreadSafe public class EvictionManagerImpl<K, V> implements EvictionManager<K, V> { // components to be injected private CacheNotifier<K, V> cacheNotifier; private AsyncInterceptorChain interceptorChain; private Configuration cfg; @Inject public void initialize(CacheNotifier<K, V> cacheNotifier, Configuration cfg, AsyncInterceptorChain chain) { this.cacheNotifier = cacheNotifier; this.cfg = cfg; this.interceptorChain = chain; } @Override public void onEntryEviction(Map<? extends K, InternalCacheEntry<? extends K, ? extends V>> evicted) { // don't reuse the threadlocal context as we don't want to include eviction // operations in any ongoing transaction, nor be affected by flags // especially see ISPN-1154: it's illegal to acquire locks in a committing transaction InvocationContext ctx = ImmutableContext.INSTANCE; // This is important because we make no external guarantees on the thread // that will execute this code, so it could be the user thread, or could // be the eviction thread. // However, when a user calls cache.evict(), you do want to carry over the // contextual information, hence it makes sense for the notifyCacheEntriesEvicted() // call to carry on taking an InvocationContext object. cacheNotifier.notifyCacheEntriesEvicted(evicted.values(), ctx, null); if (cfg.jmxStatistics().enabled()) { updateEvictionStatistics(evicted); } } private void updateEvictionStatistics(Map<? extends K, InternalCacheEntry<? extends K, ? extends V>> evicted) { CacheMgmtInterceptor mgmtInterceptor = interceptorChain.findInterceptorExtending(CacheMgmtInterceptor.class); if (mgmtInterceptor != null) { mgmtInterceptor.addEvictions(evicted.size()); } } }