2015-01-09 66 views
0

我開發一個REST應用程序讀取所有緩存在使用Ĵ緩存,榛羣集投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)可以訪問的內部定義或特定於平臺的緩存可能是 不是在迭代中出現 。

但我試圖訪問的緩存不是內部定義的 或平臺特定的。它們由其他節點創建。

我想要一種方式來獲取羣集中存在的所有名稱。有沒有辦法呢?

注意:在應用程序中不使用hazelcast.xml。全部由默認的xml初始化。

更新:

,如果我知道這個名字,我可以訪問緩存。並通過直接給名稱訪問的第一次後,現在它顯示在cacheManager.getCacheNames().iterator()

回答

1

高速緩存,但沒有內部定義,我嘗試訪問的高速緩存或特定 平臺

這很好,因爲這個方法應該返回所有其他的和一些內部定義的或平臺特定的。

+0

他是對的。它返回所有用戶定義的緩存,但可能會遺漏用於內部目的的內部緩存。 – noctarius

+0

但它不返回名稱。我對內部緩存不感興趣。我想要的是由其他節點創建的緩存。 – Shenal

2

CacheManager只提供它管理的高速緩存的名稱,因此無法使用JCache API獲取羣集已知的所有高速緩存。

在Hazelcast 3.7(EA剛剛昨天發佈),所有Cache s爲可作爲DistributedObject S,所以調用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(); 
} 
相關問題