服务器 - 客户端配置中的Geode / Gemfire分布式锁定

时间:2016-11-11 08:40:25

标签: gemfire geode

我正在关注此文档: 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配置,我应该使用来自客户端的分布式锁吗?如果没有,我该怎么做才能让客户互相锁定以便在必要时进行同步?

1 个答案:

答案 0 :(得分:0)

Region类上的DistributedLock和RegionDistributedLock API仅在Server中可用。要从客户端使用这些锁,您必须编写部署到服务器的函数。然后,客户端将告诉服务器执行功能,它可以操作Region以及DistributedLock和RegionDistributedLock API。有关FunctionService的更多信息,请访问:

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