我正在关注此文档: http://gemfire.docs.pivotal.io/docs-gemfire/latest/developing/distributed_regions/locking_in_global_regions.html 使用全局范围创建一个区域以使用分布式锁定。
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>
从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.getDistributedLock(“entrykey”);然后锁定实例之间的协调。
然而,当我致电getDistributedLock
时,我得到了IllegalStateException: only supported for GLOBAL scope, not LOCAL
我发现ClientRegionFactoryImpl的构造函数强制范围为Local,无论在region-attributes中配置什么,我没有API来覆盖它。 这一行:https://github.com/apache/incubator-geode/blob/develop/geode-core/src/main/java/org/apache/geode/cache/client/internal/ClientRegionFactoryImpl.java#L85
所以问题是,如果我使用客户端 - 服务器DS配置,我应该使用来自客户端的分布式锁吗?如果没有,我该怎么做才能让客户互相锁定以便在必要时进行同步?
答案 0 :(得分:0)
Region类上的DistributedLock和RegionDistributedLock API仅在Server中可用。要从客户端使用这些锁,您必须编写部署到服务器的函数。然后,客户端将告诉服务器执行功能,它可以操作Region以及DistributedLock和RegionDistributedLock API。有关FunctionService的更多信息,请访问:
http://geode.apache.org/docs/guide/developing/function_exec/chapter_overview.html