0

Hazel キャスト 3.3.3 で J キャッシュを使用するクラスター内のすべてのキャッシュを読み取る REST アプリケーションを開発しています。

このアプリケーションで次の行を呼び出すと、別のヘーゼル キャスト ノードが作成されます。

cacheManager= Caching.getCachingProvider().getCacheManager();

ノードは、作成済みのノードでクラスター化されます。しかし、次のコマンドでクラスターのすべてのキャッシュ名を取得しようとすると、空の iterable が返されます。

cacheManager.getCacheNames().iterator()

以下を含む Jcache の Java ドキュメントを調べました。

CacheManager によって管理されるすべてのキャッシュを提供するとは限りません。例: getCache(java.lang.String) または getCache(java.lang.String,java.lang.Class,java.lang.Class) への呼び出しによってアクセスできる内部定義またはプラットフォーム固有のキャッシュが存在しない場合があります。反復で。

しかし、アクセスしようとしているキャッシュは、内部で定義されていないか、プラットフォーム固有ではありません。それらは他のノードによって作成されます。

クラスターに存在するすべての名前を取得する方法が必要です。これに方法はありますか?

注意: アプリケーションでは hazelcast.xml は使用されません。すべてがデフォルトの xml によって初期化されます。

アップデート:

名前がわかればキャッシュにアクセスできます。そして、名前を直接指定して初めてア​​クセスした後、そのキャッシュがcacheManager.getCacheNames().iterator()

4

2 に答える 2

2

CacheManagerは管理するキャッシュの名前のみを提供するため、JCache API を使用してクラスターに認識されているすべてのキャッシュを取得することはできません。

Hazelcast 3.7 (EA は昨日リリースされたばかりです) では、すべてCacheの が として利用できるため、オブジェクトがインスタンスであるか、Hazelcast 固有のサブクラスであるかDistributedObjectを呼び出してチェックすると、クラスター内のすべての への参照を取得できるはずです。HazelcastInstance.getDistributedObjects()javax.cache.Cachecom.hazelcast.cache.ICacheCache

// works for 3.7
Collection<DistributedObject> distributedObjects = hazelcastInstance.getDistributedObjects();
for (DistributedObject distributedObject : distributedObjects) {
     if (distributedObject instanceof ICache) {
        System.out.println("Found cache with name " + distributedObject.getName());
     }
}

Hazelcast 3.6 では、クラスターが認識しているすべてのキャッシュ名を内部クラスのみを使用して取得できるため、これが他のバージョンで機能する保証はありません。

// works for 3.6 using internal classes, most probably will not work for other versions
public static void main(String[] args) {

    // start a hazelcast instance
    HazelcastInstance hz = Hazelcast.newHazelcastInstance();

    // create a CacheManager and Cache on this instance
    CachingProvider hazelcastCachingProvider = Caching.getCachingProvider("com.hazelcast.cache.HazelcastCachingProvider",
            HazelcastCachingProvider.class.getClassLoader());
    CacheManager cacheManager = hazelcastCachingProvider.getCacheManager();
    cacheManager.createCache("test1", new CacheConfig<Object, Object>());

    // hacky: obtain a reference to internal cache service
    CacheDistributedObject cacheDistributedObject = hz.getDistributedObject("hz:impl:cacheService", "setupRef");
    ICacheService cacheService = cacheDistributedObject.getService();

    // obtain all CacheConfig's in the cluster
    Collection<CacheConfig> cacheConfigs = cacheService.getCacheConfigs();
    for (CacheConfig cacheConfig : cacheConfigs) {
        System.out.println("Cache name: " + cacheConfig.getName() + 
            ", fully qualified name: " + cacheConfig.getNameWithPrefix());
    }

    hz.shutdown();
}
于 2016-06-09T09:40:35.650 に答える