0

我正在开发一个 REST 应用程序来读取使用 J Cache 和 Hazel cast 3.3.3 的集群中的所有缓存

当我在应用程序中调用以下行时,此应用程序将创建另一个 hazel cast 节点:

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

该节点与已创建的节点聚集在一起。但是当我尝试使用以下命令获取集群的所有缓存名称时,它返回一个空的可迭代对象:

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)中,所有Caches 都可以作为DistributedObjects 使用,因此调用HazelcastInstance.getDistributedObjects()然后检查对象是实例javax.cache.Cache还是 Hazelcast 特定子类com.hazelcast.cache.ICache,您应该能够获得对Cache集群中所有 s 的引用:

// 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 回答
1

但是我尝试访问的缓存不是内部定义的或特定于平台的

这很好,因为此方法应该返回所有其他方法以及一些内部定义或平台特定的方法。

于 2015-01-09T08:57:15.637 回答