2012-10-24 64 views
4

我目前正在爲一個由許多不同的小模塊組成的應用程序編寫一些監控代碼,其中許多使用EhCache。我的目標是從應用中的每個緩存中收集關於命中率,緩存內容等的統計信息。但是,我遇到了一些實現此功能的麻煩,因爲啓用統計信息是EhCache中的一項選擇性功能。我正在尋找一種以自動方式爲所有緩存啓用統計信息的方法,以便維護不同模塊的開發人員不必始終記住啓用它們。在EhCache中,是否可以在所有緩存上啓用統計信息?

我可以在JavaDoc中找到最接近的事(但仍然無法正常工作是):

cacheManager.getDefaultCacheConfiguration().setStatisticsEnabled(true); 

該方法調用能夠在默認的緩存而緩存的其餘部分統計數據將不受影響。

我想過的另一個想法是包裝CacheManager,以攔截創建緩存並自動選擇進入統計的調用。不幸的是,CacheManager是一個類,而不是一個接口,所以這樣的解決方案需要大量的代碼,並且會變得脆弱 - 每當EhCache發展時添加/刪除公共方法,我都必須更新我的子類。

有沒有人遇到過類似的問題?如果是這樣,你是如何解決它的?非常感謝......

回答

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=""/> 

要注意,如果您將默認緩存有這可能是重要的啓用統計信息,那麼動態創建的任何緩存都將默認啓用統計信息,除非創建緩存的任何內容專門將其關閉。

+0

這基本上就是我所做的,但問題是它隻影響當時存在的緩存 - 任何稍後添加的緩存都不會啓用統計信息。 :( – stevevls

+0

好吧我更新了我的答案。使用偵聽器可以對動態創建的任何緩存進行相同的更改。 – Cameron

相關問題