gpt4 book ai didi

java - 获取所有缓存名称

转载 作者:行者123 更新时间:2023-12-01 22:30:35 24 4
gpt4 key购买 nike

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

当我在应用程序中调用以下行时,该应用程序将创建另一个淡褐色类型转换节点:

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

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

cacheManager.getCacheNames().iterator()

我浏览了 Jcache 的 Java 文档,其中包含:

May not provide all of the Caches managed by the CacheManager. For example: Internally defined or platform specific Caches that may be accessible by a call to getCache(java.lang.String) or getCache(java.lang.String,java.lang.Class,java.lang.Class) may not be present in an iteration.

但是我尝试访问的缓存不是内部的 已定义或特定于平台。它们是由其他节点创建的。

我想要一种方法来获取集群中存在的所有名称。有办法吗?

注意:应用程序中未使用 hazelcast.xml。全部由默认的 xml 初始化。

更新:

如果我知道名称,我就可以访问缓存。第一次通过直接给出名称访问后,现在显示缓存在cacheManager.getCacheNames().iterator()

最佳答案

CacheManager 仅提供其管理的缓存名称,因此您无法使用 JCache API 获取集群已知的所有缓存。

在 Hazelcast 3.7(EA 昨天刚刚发布)中,所有 Cache 都可以作为 DistributedObject 提供,因此调用 HazelcastInstance.getDistributedObjects() 然后检查对象是 javax.cache.Cache 或 Hazelcast 特定子类 com.hazelcast.cache.ICache 的实例,您应该能够获取对所有对象的引用集群中的缓存:

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

关于java - 获取所有缓存名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27856739/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com