如何从EhCache 3的CacheEvent中获取缓存的别名(名称)?
解决EhCache通用监听器获取缓存别名的问题
核心解决方案
在你的DefaultListener的onEvent方法中,直接通过CacheEvent对象获取对应的缓存实例,再调用getAlias()方法即可拿到缓存的别名(名称)。
修改后的监听器代码:
import org.ehcache.Cache; import org.ehcache.event.CacheEvent; import org.ehcache.event.CacheEventListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Component public class DefaultListener implements CacheEventListener<Object, Object> { private static final Logger LOGGER = LoggerFactory.getLogger(DefaultListener.class); public DefaultListener() {} @Override public void onEvent(CacheEvent<?, ?> cacheEvent) { // 获取触发事件的缓存别名 Cache<?, ?> cache = cacheEvent.getCache(); String cacheAlias = cache.getAlias(); String key = cacheEvent.getKey().toString(); String oldValue = cacheEvent.getOldValue() == null ? "null" : cacheEvent.getOldValue().toString(); String newValue = cacheEvent.getNewValue() == null ? "null" : cacheEvent.getNewValue().toString(); LOGGER.debug("Cache {}, EventType: {} : Key: {} | value {} -> {}", cacheAlias, cacheEvent.getType(), key, oldValue, newValue); } }
关键说明
- API依赖:确保导入的是EhCache 3原生的
org.ehcache.event.CacheEvent和org.ehcache.Cache类,而非JCache(javax.cache)的相关接口,因为getAlias()是EhCache原生Cache实例的方法。 - 监听器实例管理注意点:
你当前通过XML配置监听器时,EhCache会自行实例化DefaultListener类,而你给该类标注了@Component,Spring也会创建一个独立实例。如果需要监听器使用Spring的依赖注入能力(比如注入其他Bean),建议移除XML中的listener配置,改用Spring代码注册监听器:
@Configuration @EnableCaching public class CacheConfig { @Autowired private DefaultListener defaultListener; @Bean public JCacheManagerCustomizer cacheManagerCustomizer() { return cacheManager -> { // 遍历所有缓存,为每个缓存注册通用监听器 for (String cacheName : cacheManager.getCacheNames()) { javax.cache.Cache<Object, Object> jcache = cacheManager.getCache(cacheName); if (jcache != null) { // 将JCache实例转换为EhCache原生Cache org.ehcache.Cache<Object, Object> ehcache = org.ehcache.jsr107.Eh107Cache.unwrap(jcache); // 注册监听器,配置事件触发模式和监听的事件类型 ehcache.registerCacheEventListener( defaultListener, org.ehcache.event.EventOrdering.UNORDERED, org.ehcache.event.EventFiring.ASYNCHRONOUS, org.ehcache.event.EventType.CREATED, org.ehcache.event.EventType.EXPIRED, org.ehcache.event.EventType.EVICTED, org.ehcache.event.EventType.REMOVED, org.ehcache.event.EventType.UPDATED ); } } }; } }
这样配置后,监听器由Spring管理,可以正常注入其他依赖组件,同时实现给所有缓存添加通用监听器的需求。
内容的提问来源于stack exchange,提问作者ssimm
相关产品推荐
相关产品推荐

