2016-11-11 50 views
0

我正在關注此文檔: http://gemfire.docs.pivotal.io/docs-gemfire/latest/developing/distributed_regions/locking_in_global_regions.html 創建一個區域使用全局範圍使用分佈式鎖定。Geode/Gemfire分佈式鎖定在服務器端客戶端配置

Cache.xml:

<client-cache> 
<pool>…definition…</pool> 
… 
<!--region-attributes For Lock region--> 
<region-attributes id="GZ_GLOBAL_REGION_LOCK_ATTRIBUTES" scope="global" pool-name="Zero"/> 
… 
</client-cache> 

代碼GemFireCache之後,從gemfire.properties和cache.xml創建:

private Region<String, Object> getOrCreateLockRegion(GemFireCache gemfireCache) { 
    Region<String, Object> region = gemfireCache.getRegion(lockRegionName); 
    if (region == null) { 
     if(!isUsingClientCache) { 
      region = createRegionFactory((Cache)gemfireCache, String.class, Object.class, lockRegionAttributesID).create(lockRegionName); 
     } else { 
      region = createClientRegionFactory((ClientCache) gemfireCache, String.class, Object.class, lockRegionAttributesID).create(lockRegionName); 
     } 
    } 
    return region; 
} 

protected <K, V> RegionFactory<K, V> createRegionFactory(Cache gemfireCache, Class<K> keyClass, Class<V> valueClass, String regionAttributeRefID) { 
    return gemfireCache 
      .<K, V>createRegionFactory(regionAttributeRefID) 
      .setKeyConstraint(keyClass) 
      .setValueConstraint(valueClass); 
} 

protected <K, V> ClientRegionFactory<K, V> createClientRegionFactory(ClientCache gemfireCache, Class<K> keyClass, Class<V> valueClass, String regionAttributeRefID) { 
    return gemfireCache 
      .<K, V>createClientRegionFactory(regionAttributeRefID) 
      .setKeyConstraint(keyClass) 
      .setValueConstraint(valueClass); 
} 

我想這會給我一個區域與Scope.Global,讓我可以調用region.getDistributedLock(「entrykey」);然後鎖定實例之間的協調。

然而,當我打電話getDistributedLock,我得到了一個IllegalStateException: only supported for GLOBAL scope, not LOCAL

而且我發現的ClientRegionFactoryImpl力範圍,以當地的構造,無論在區域屬性配置什麼,我沒有API來覆蓋它。 This line:https://github.com/apache/incubator-geode/blob/develop/geode-core/src/main/java/org/apache/geode/cache/client/internal/ClientRegionFactoryImpl.java#L85

所以問題是,如果我使用客戶端 - 服務器DS配置,我應該使用客戶端的分佈式鎖嗎?如果不是,我該怎麼做才能讓客戶互相鎖定,以便在必要時進行同步?

回答

0

Region類中的DistributedLock和RegionDistributedLock API只能在服務器中使用。爲了從客戶端使用這些鎖,您必須編寫部署到服務器的函數。然後客戶端會告訴服務器執行該函數,在該函數中它可以操縱該區域以及DistributedLock和RegionDistributedLock API。有關FunctionService的更多信息,請訪問:

http://geode.apache.org/docs/guide/developing/function_exec/chapter_overview.html

+0

感謝您的回答柯克。我看到另一個線程也或多或少地提出了同樣的問題。你怎麼看待這種方法:http://stackoverflow.com/a/40854854/2841265 ...將「putIfAbsence」可靠地並且自動地從clustor中的客戶端更新條目? –

+0

是的,我喜歡這個解決方案。我沒有嘗試過,但它聽起來像應該工作。 –

+0

一旦有機會,我會嘗試一下並更新 –