如何为Caffeine缓存配置启用JMX监控功能?
配置失效核心原因
你当前的配置仅定义了JCache的通用默认模板,没有绑定实际使用的缓存实例,且仅适配通过JCache API创建的缓存,如果你直接使用原生Caffeine API创建缓存,这套配置本身就不会生效。
分场景解决方案
场景1:使用JCache API管理缓存
- 首先确认项目已引入Caffeine的JCache适配依赖,Maven坐标参考:
<dependency> <groupId>com.github.benmanes.caffeine</groupId> <artifactId>caffeine-jcache</artifactId> <version>你的Caffeine版本号</version> </dependency> - 修改
application.conf,在caffeine.jcache节点下补充你实际使用的缓存名称,继承默认配置即可:caffeine.jcache { default { monitoring { statistics = true management = true } } # 替换下面的缓存名称为你实际使用的缓存名,有多个就加多行 yourCacheName = ${caffeine.jcache.default} otherCacheName = ${caffeine.jcache.default} } - 确认你使用Caffeine官方的JCache Provider获取缓存管理器:
按上述配置创建的缓存会自动注册JMX Bean,不需要额外编码。CachingProvider provider = Caching.getCachingProvider("com.github.benmanes.caffeine.jcache.spi.CaffeineCachingProvider"); CacheManager cacheManager = provider.getCacheManager();
场景2:使用原生Caffeine API创建缓存
如果直接通过Caffeine.newBuilder()创建缓存,不需要依赖JCache,手动注册JMX Bean即可:
- 构建缓存时开启统计能力:
Cache<String, Object> cache = Caffeine.newBuilder() .recordStats() // 必须开启该配置才会生成运行指标 .maximumSize(1000) .build(); - 定义JMX暴露接口和实现类:
// JMX指标接口 public interface CaffeineCacheStatsMBean { long getHitCount(); long getMissCount(); double getHitRate(); long getEvictionCount(); long getEstimatedSize(); } // 指标实现类 public class CaffeineCacheStatsJmxBean implements CaffeineCacheStatsMBean { private final Cache<?, ?> cache; public CaffeineCacheStatsJmxBean(Cache<?, ?> cache) { this.cache = cache; } @Override public long getHitCount() { return cache.stats().hitCount(); } @Override public long getMissCount() { return cache.stats().missCount(); } @Override public double getHitRate() { return cache.stats().hitRate(); } @Override public long getEvictionCount() { return cache.stats().evictionCount(); } @Override public long getEstimatedSize() { return cache.estimatedSize(); } } - 缓存初始化完成后注册到JMX服务:
import java.lang.management.ManagementFactory; import javax.management.*; public void registerCacheToJmx(Cache<?, ?> cache, String cacheName) throws Exception { MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); ObjectName objectName = new ObjectName("com.your.business:type=CaffeineCache,name=" + cacheName); mBeanServer.registerMBean(new CaffeineCacheStatsJmxBean(cache), objectName); }
效果验证
应用启动后通过JConsole、VisualVM等工具连接进程,在MBean面板下查找对应名称的Bean,即可查看实时运行指标。
内容的提问来源于stack exchange,提问作者Alain P
相关产品推荐
相关产品推荐

