我正在开发一个REST应用程序来读取集群中使用J Cache和Hazel cast 3.3.3的所有缓存
当我在应用程序中调用以下行时,此应用程序将创建另一个hazel强制转换节点:
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 s初始化。
更新
如果我知道名字,我可以访问缓存。通过直接提供名称第一次访问后,现在它在cacheManager.getCacheNames().iterator()
答案 0 :(得分:2)
CacheManager
仅提供它管理的缓存的名称,因此您无法使用JCache API获取群集已知的所有缓存。
在Hazelcast 3.7(EA昨天发布)中,所有Cache
都可用作DistributedObject
个,因此调用HazelcastInstance.getDistributedObjects()
然后检查对象是{{1}的实例或者特定于Hazelcast的子类javax.cache.Cache
,您应该能够获得对集群中所有com.hazelcast.cache.ICache
的引用:
Cache
在Hazelcast 3.6中,只能使用内部类获取群集已知的所有缓存名称,因此无法保证这适用于任何其他版本。
// 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());
}
}
答案 1 :(得分:1)
但我尝试访问的缓存不是内部定义的 特定于平台
这很好,因为这个方法应该返回所有其他方法以及一些内部定义的或特定于平台的方法。