Java 在EhCache中,是否可以在所有缓存上默认启用统计信息?

Java 在EhCache中,是否可以在所有缓存上默认启用统计信息?,java,monitoring,ehcache,Java,Monitoring,Ehcache,我目前正在为一个应用程序编写一些监控代码,该应用程序由许多不同的小模块组成,其中许多模块利用了EhCache。我的目标是收集应用程序中每个缓存的命中率、缓存内容等统计信息。然而,我在实现这个特性时遇到了一些麻烦,因为启用统计信息是EhCache中的一个选择加入特性。我正在寻找一种自动为所有缓存启用统计信息的方法,以便维护不同模块的开发人员不必总是记住启用它们 我能在JavaDocs中找到的最接近的东西(但仍然不起作用)是: 该方法调用仅对默认缓存启用统计信息,而其余缓存将不受影响 我的另一个想法

我目前正在为一个应用程序编写一些监控代码,该应用程序由许多不同的小模块组成,其中许多模块利用了EhCache。我的目标是收集应用程序中每个缓存的命中率、缓存内容等统计信息。然而,我在实现这个特性时遇到了一些麻烦,因为启用统计信息是EhCache中的一个选择加入特性。我正在寻找一种自动为所有缓存启用统计信息的方法,以便维护不同模块的开发人员不必总是记住启用它们

我能在JavaDocs中找到的最接近的东西(但仍然不起作用)是:

该方法调用仅对默认缓存启用统计信息,而其余缓存将不受影响

我的另一个想法是包装CacheManager,以便拦截创建缓存的调用,并自动将它们选择到统计中。不幸的是,CacheManager是一个类,而不是一个接口,因此这样的解决方案需要大量的代码,而且非常脆弱——每当公共方法随着EhCache的发展而被添加/删除时,我都必须更新我的子类


有没有人遇到过类似的问题?如果是,你是如何着手解决的?非常感谢…

一旦创建了缓存,您可以执行以下操作:

for (CacheManager manager : CacheManager.ALL_CACHE_MANAGERS) {
  for (String name : manager.getCacheNames()) {
    manager.getCache(name).getCacheConfiguration().setStatistics(true);
  }
}
public class StatisticsEnabledCacheManagerListener implements CacheManagerEventListener {
  public void notifyCacheAdded(String cacheName) {
    CacheManager.getInstance().getCache(cacheName).getCacheConfiguration().setStatistics(true);
  }

  public void notifyCacheRemoved(String cacheName) {}
}
当然,您需要添加错误检查

如果有动态创建的缓存,则可以使用缓存管理器事件侦听器(请参阅)。基本上,您必须通过扩展
CacheManagerEventListenerFactory
来创建一个工厂,然后通过实现
CacheManagerEventListener
来创建实际的侦听器。侦听器可能如下所示:

for (CacheManager manager : CacheManager.ALL_CACHE_MANAGERS) {
  for (String name : manager.getCacheNames()) {
    manager.getCache(name).getCacheConfiguration().setStatistics(true);
  }
}
public class StatisticsEnabledCacheManagerListener implements CacheManagerEventListener {
  public void notifyCacheAdded(String cacheName) {
    CacheManager.getInstance().getCache(cacheName).getCacheConfiguration().setStatistics(true);
  }

  public void notifyCacheRemoved(String cacheName) {}
}
要向Ehcache注册工厂,请将以下内容添加到Ehcache.xml:

<cacheManagerEventListenerFactory class="com.example.cache.MyListenerFactory" properties=""/>


需要注意的是,如果您将默认缓存设置为启用统计信息,那么您动态创建的任何缓存都将默认启用统计信息,除非创建缓存的任何东西都明确地将其关闭。

这基本上就是我所做的,但问题是,它只影响在该时间点存在的缓存——以后添加的任何缓存都不会启用统计信息(好的,我更新了我的答案。使用侦听器,您可以对动态创建的任何缓存进行相同的更改。