我正在遵循此文档:http://gemfire.docs.pivotal.io/docs-gemfire/latest/developing/distributed_regions/locking_in_global_regions.html创建具有全局范围的区域以使用分布式锁定。
缓存. 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>
从gemfire.properties和cache. xml创建GemFireCache后的代码:
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. getGenertedLock("entrykey");然后让锁在实例之间进行协调。
但是,当我调用getPubltedLock
时,我得到了一个IllegalStateException:仅支持GLOBAL范围,不支持LOCAL
我发现ClientRegion onFactoryImpl的构造函数强制作用域为Local,而不管在region-属性中配置了什么,我没有API覆盖它。这一行:https://github.com/apache/incubator-geode/blob/develop/geode-core/src/main/java/org/apache/geode/cache/client/internal/ClientRegionFactoryImpl.java#L85
所以问题是,如果我使用客户端-服务器DS配置,我应该使用来自客户端的分布式锁吗?如果没有,我应该做什么来使客户端相互锁定以在必要时同步?
Region类上的分布式锁和区域分布式锁API仅在服务器中可用。为了从客户端使用这些锁,您必须编写部署到服务器的函数。然后,客户端将告诉服务器执行函数,它可以在其中操作区域以及分布式锁和区域分布式锁API。有关FunctionService的更多信息,请访问:
http://geode.apache.org/docs/guide/developing/function_exec/chapter_overview.html.