Я использовал JCache с EhCache в качестве провайдера. Используя MBean, я могу получить статистику кеша, но отсутствуют такие атрибуты, как размер кеша. Я вижу, LiveCacheStatistics предоставляет это, но как получить его экземпляр из JCache
List<Map<String,Object>> cacheStatasticsList = new ArrayList<>();
try {
final MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer();
final Set<ObjectInstance> cacheBeans = beanServer.queryMBeans(ObjectName.getInstance("javax.cache:type=CacheStatistics,CacheManager=*,Cache=*"), null);
for (ObjectInstance cacheBean : cacheBeans) {
final CacheStatisticsMXBean cacheStatisticsMXBean =
MBeanServerInvocationHandler.newProxyInstance(beanServer, cacheBean.getObjectName(), CacheStatisticsMXBean.class, false);
Map<String,Object> cacheStatasticsMap = new HashMap<>();
cacheStatasticsMap.put("Name",cacheBean.getObjectName().getKeyProperty("Cache"));
cacheStatasticsMap.put("Gets",cacheStatisticsMXBean.getCacheGets());
cacheStatasticsMap.put("Hits",cacheStatisticsMXBean.getCacheHits());
cacheStatasticsMap.put("Misses",cacheStatisticsMXBean.getCacheMisses());
cacheStatasticsMap.put("Removals",cacheStatisticsMXBean.getCacheRemovals());
cacheStatasticsMap.put("Evictions", cacheStatisticsMXBean.getCacheEvictions());
cacheStatasticsMap.put("AvgGetTime", cacheStatisticsMXBean.getAverageGetTime());
cacheStatasticsMap.put("AvgPutTime", cacheStatisticsMXBean.getAveragePutTime());
cacheStatasticsMap.put("AvgRemoveTime" , cacheStatisticsMXBean.getAverageRemoveTime());
cacheStatasticsList.add(cacheStatasticsMap);
}
} catch(Exception e){
log.error("Error in getting cache statistics.");
return cacheStatasticsList;
}
return cacheStatasticsList;