我目前正在为一个应用程序编写一些监控代码,该应用程序由许多不同的小模块组成,其中许多模块都使用了EhCache。我的目标是从应用程序中的每个缓存中收集有关命中率,缓存内容等的统计信息。但是,我在实现此功能时遇到了一些麻烦,因为启用统计信息是EhCache中的一个选择加入功能。我正在寻找一种方法,以自动方式为所有缓存启用统计信息,以便维护不同模块的开发人员不必始终记住启用它们。
我在JavaDocs中找到的最接近的东西(但仍然没有用):
cacheManager.getDefaultCacheConfiguration().setStatisticsEnabled(true);
该方法调用仅启用默认缓存的统计信息,而其他缓存不会受到影响。
我的另一个想法是包装CacheManager以拦截创建缓存的调用并自动选择它们进行统计。不幸的是,CacheManager是一个类,而不是一个接口,所以这样的解决方案需要大量的代码并且会很脆弱 - 每当EhCache发展时添加/删除公共方法时,我都必须更新我的子类。
有没有人遇到过类似的问题?如果是这样,你是如何解决它的?非常感谢......
答案 0 :(得分:3)
在创建缓存后的某个时刻,您可以执行以下操作:
for (CacheManager manager : CacheManager.ALL_CACHE_MANAGERS) {
for (String name : manager.getCacheNames()) {
manager.getCache(name).getCacheConfiguration().setStatistics(true);
}
}
当然,您想要添加错误检查。
如果您拥有动态创建的缓存,则可以使用缓存管理器事件侦听器(请参阅the documentation)。基本上,您必须通过扩展CacheManagerEventListenerFactory
来创建工厂,然后通过实现CacheManagerEventListener
来创建实际的侦听器。听众可能看起来像这样:
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=""/>
值得注意的是,如果您将默认缓存设置为启用了统计信息,那么您动态创建的任何缓存都将默认启用统计信息,除非创建缓存的任何内容专门将其关闭。