4

私は現在、多くの異なる小さなモジュールで構成されているアプリの監視コードを書いています。その多くはEhCacheを利用しています。私の目標は、アプリの各キャッシュからヒット率、キャッシュの内容などに関する統計を収集することです。ただし、統計の有効化はEhCacheのオプトイン機能であるため、この機能の実装で問題が発生しています。さまざまなモジュールを管理している開発者が常にそれらを有効にすることを覚えておく必要がないように、すべてのキャッシュに対して自動的に統計を有効にする方法を探しています。

JavaDocsで見つけた最も近いもの(しかし、それでも機能しません):

cacheManager.getDefaultCacheConfiguration().setStatisticsEnabled(true);

このメソッド呼び出しは、デフォルトのキャッシュでのみ統計を有効にしますが、残りのキャッシュは影響を受けません。

私が持っていたもう1つの考えは、キャッシュを作成する呼び出しをインターセプトし、それらを統計に自動的にオプトインするようにCacheManagerをラップすることでした。残念ながら、CacheManagerはクラスであり、インターフェースではないため、このようなソリューションは多くのコードを必要とし、脆弱になります。EhCacheの進化に伴ってパブリックメソッドが追加/削除されるたびに、サブクラスを更新する必要があります。

誰かが同様の問題に遭遇しましたか?もしそうなら、どのようにそれを解決しようとしましたか?どうもありがとう...

4

1 に答える 1

3

キャッシュが作成されたら、次のようなことができます。

for (CacheManager manager : CacheManager.ALL_CACHE_MANAGERS) {
  for (String name : manager.getCacheNames()) {
    manager.getCache(name).getCacheConfiguration().setStatistics(true);
  }
}

もちろん、エラー チェックを追加する必要があります。

動的に作成されたキャッシュがある場合は、キャッシュ マネージャー イベント リスナーを使用できます (ドキュメントを参照してください)。基本的には、 を拡張してファクトリを作成し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=""/>

デフォルトのキャッシュを設定して統計を有効にする場合、動的に作成するキャッシュはデフォルトで統計が有効になることに注意してください。

于 2013-07-24T16:11:54.640 に答える