Получение всех имен кэша

Я разрабатываю приложение REST для чтения всех кешей в кластере, который использует J Cache с Hazel cast 3.3.3

Это приложение создаст еще один узел приведения лещины, когда я вызову следующую строку в приложении:

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

Узел объединяется с уже созданными узлами. Но когда я пытаюсь получить все имена кэша кластера с помощью следующей команды, он возвращает пустую итерацию:

cacheManager.getCacheNames().iterator()

Я просмотрел документацию по Jcache на Java, которая содержала:

Может не предоставлять все кэши, управляемые CacheManager. Например: внутренне определенные или специфичные для платформы кэши, которые могут быть доступны посредством вызова getCache(java.lang.String) или getCache(java.lang.String,java.lang.Class,java.lang.Class), могут отсутствовать в итерации.

Но кэши, к которым я пытаюсь получить доступ, не определены внутренне или не зависят от платформы. Они созданы другими узлами.

Я хочу, чтобы получить все имена, присутствующие в кластере. Есть ли способ к этому?

NB. В приложении не используется hazelcast.xml. Все инициализируется по умолчанию xml s.

Обновить:

Я могу получить доступ к кешу, если знаю имя. И после первого доступа, дав имя напрямую, теперь он показывает, что кеш в cacheManager.getCacheNames().iterator()

2 ответа

CacheManager предоставляет только имена кэшей, которыми он управляет, поэтому вы не можете получить все кэши, известные кластеру, используя JCache API.

В Hazelcast 3.7 (EA был выпущен только вчера), все Caches доступны как DistributedObjectс, так ссылаясь HazelcastInstance.getDistributedObjects() а затем проверка объектов, являющихся экземплярами javax.cache.Cache или Hazelcast-специфичный подкласс com.hazelcast.cache.ICache Вы должны быть в состоянии получить ссылки на все Cacheв кластере:

// 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();
}

Но кэши, к которым я пытаюсь получить доступ, не определены внутренне или не зависят от платформы

Это хорошо, потому что этот метод должен возвращать все остальные и некоторые из определенных внутри или для конкретной платформы.

Другие вопросы по тегам