我正在關注此文檔: 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配置,我應該使用客戶端的分佈式鎖嗎?如果不是,我該怎麼做才能讓客戶互相鎖定,以便在必要時進行同步?
感謝您的回答柯克。我看到另一個線程也或多或少地提出了同樣的問題。你怎麼看待這種方法:http://stackoverflow.com/a/40854854/2841265 ...將「putIfAbsence」可靠地並且自動地從clustor中的客戶端更新條目? –
是的,我喜歡這個解決方案。我沒有嘗試過,但它聽起來像應該工作。 –
一旦有機會,我會嘗試一下並更新 –