如何通过监听器获取org.apache.cayenne.util.concurrentlinkedhashmap被驱逐值
ConcurrentLinkedHashMap 驱逐条目监听实现方案
你使用的org.apache.cayenne.util.concurrentlinkedhashmap组件原生提供了驱逐监听器回调能力,按以下步骤实现即可获取被自动驱逐的条目:
步骤1:实现驱逐监听器接口
首先自定义类实现EvictionListener<K, V>接口,重写onEviction方法,该方法的入参就是被驱逐条目的key和value,你可以在该方法内实现你的业务处理逻辑:
import org.apache.cayenne.util.concurrentlinkedhashmap.EvictionListener; public class CacheEvictionListener<K, V> implements EvictionListener<K, V> { @Override public void onEviction(K evictedKey, V evictedValue) { // 示例:打印被驱逐的条目信息,可替换为你的业务逻辑(如持久化、日志上报等) System.out.printf("缓存条目被驱逐:key=%s,value=%s%n", evictedKey, evictedValue); } }
步骤2:构建缓存时绑定监听器
在初始化ConcurrentLinkedHashMap实例时,通过Builder的listener方法绑定你实现的监听器即可:
import org.apache.cayenne.util.concurrentlinkedhashmap.ConcurrentLinkedHashMap; // 初始化缓存 ConcurrentLinkedHashMap<String, Object> bizCache = new ConcurrentLinkedHashMap.Builder<String, Object>() .maximumWeightedCapacity(3000) // 你原有配置的缓存容量阈值 .listener(new CacheEvictionListener<>()) // 绑定自定义驱逐监听器 .build();
注意事项
- 只有缓存达到容量上限触发的自动驱逐操作才会调用监听器,手动调用
remove()等方法主动删除的条目不会触发该回调。 - 监听器内部逻辑尽量轻量化,避免长时间阻塞,否则会影响缓存的正常读写性能。
- 驱逐操作是多线程异步触发时,监听器的业务逻辑需要自行保证线程安全。
内容的提问来源于stack exchange,提问作者Akshay Sakunde
相关产品推荐
相关产品推荐

