You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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);
    }
}

关键说明

  1. API依赖:确保导入的是EhCache 3原生的org.ehcache.event.CacheEvent和org.ehcache.Cache类,而非JCache(javax.cache)的相关接口,因为getAlias()是EhCache原生Cache实例的方法。
  2. 监听器实例管理注意点:
    你当前通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 03:34:52