Получение всех имен кэша
Я разрабатываю приложение 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 был выпущен только вчера), все Cache
s доступны как 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();
}
Но кэши, к которым я пытаюсь получить доступ, не определены внутренне или не зависят от платформы
Это хорошо, потому что этот метод должен возвращать все остальные и некоторые из определенных внутри или для конкретной платформы.