是否可以在一个JVM中启动PIvotal GemFire服务器,定位器和客户端?

时间:2018-08-21 03:59:44

标签: gemfire spring-data-gemfire

我想使用 Spring Boot 在单个JVM中启动Pivotal GemFire服务器,定位器和客户端。

服务器和定位器启动正常(我在服务器return Observable.forkJoin(obs) .catch(error=>{ console.log('error encountered',error); //handle your errors here //Return an empty Observable to terminate the stream return Observable.empty(); }); 中使用了“ start-locator”)。

但是,当我尝试启动连接到定位器的客户端时,出现了异常:

gemfire.properties

并且,在例外情况下,将打印出服务器用于连接到定位器的现有属性。

这是客户端上的代码:

java.lang.IllegalStateException: A connection to a distributed system already exists in this VM. 

    at com.gemstone.gemfire.distributed.internal.InternalDistributedSystem.validateSameProperties(InternalDistributedSystem.java:3054)
    at com.gemstone.gemfire.distributed.DistributedSystem.connect(DistributedSystem.java:1642)

关键GemFire版本是8.2.5。

我在调试模式下进行了跟踪,该异常被引发在clientCacheFactory.create()行上,并且在该方法中,传入的属性文件是正确的,只有两个条目。

Pivotal GemFire是否有某些限制,使得我无法通过这种方式连接?

2 个答案:

答案 0 :(得分:0)

是的,这是已知的限制,每个JVM不能有多个缓存(带有嵌入式定位器的服务器除外)。 干杯。

答案 1 :(得分:0)

简而言之,不,您不能在同一个JVM(或Java应用程序进程)中拥有对等Cache实例(具有嵌入式定位器)和ClientCache实例。

在Apache Geode / Pivotal GemFire中,缓存实例(对等Cache(分布式系统或集群的对等成员)还是ClientCache实例是 < em> Singleton 。 因此,每个JVM只能有1个GemFire缓存实例(或更严格地说,是ClassLoader,但我们不会走这条丑陋的路)。

无论如何,当缓存实例已经存在时,任何随后的缓存创建尝试都会说,使用GemFire的o.a.g.cache.client.ClientCacheFactory创建ClientCache实例(当对等Cache实例由{ {3}}(已经存在)将导致检查,其中GemFire非常希望缓存实例是相同的(即,对等Cache存在,因此最好尝试创建相同的缓存(无论如何,通过配置) “对等” Cache实例)。显然,ClientCache实例将不会具有与对等Cache实例相同的(分布式系统)配置,并且会失败。

您可以看到逻辑以o.a.g.cache.CacheFactory开头。创建缓存实例的第一件事是检查并查找现有的缓存实例。 ClientCache实例不能设置locatorsmcast-port属性(here);如果是这样,则会导致错误(通常是客户端和对等缓存实例之间的另一个区别,特别是locators属性)。

如果现有实例未关闭或关闭,则它将转到here。创建另一个缓存实例的唯一方法几乎是同一实例。配置验证非常广泛。

关于在Apache Geode开发人员列表上更改GemFire缓存实例的“ Singletone ”性质的讨论,但是在这方面尚未实现这是一项艰巨的任务,部分原因是 static (Client)CacheFactory.getAnyInstance()(或更糟的是GemFireCacheImpl.getInstance();对等和客户端缓存实例共享相同的基类... org.apache.geode.cache.internal.GemFireCacheImpl )在整个代码库中得到了广泛使用,而不是将缓存实例传递给相关的GemFire对象/组件,例如就像地区

无论如何,对不起,此答案不能为您带来任何缓解。

但是,我经常创建两个单独的 Spring Boot 应用程序(类)来分别配置和引导validate the configuration和1个或多个client

在服务器上,我什至在单个服务器实例中使用servers,以便可以形成一个小型群集(与Spring profile to active a Locator/Manager)和embedded Locator,以便也可以连接使用 Gfsh 到此群集。

因此,您可以使用相同的类来启动一个小型集群。第一个服务器的说明如下:

$java -cp ... -Dspring.profiles.active=locator-manager example.app.geode.cache.server. GeodeServerApplication

然后使用以下命令启动加入第一台服务器的子序列服务器:

$java -cp ... -Dspring.data.gemfire.name=ServerTwo -Dspring.data.gemfire.cache.server.port=42424 example.app.geode.cache.server. GeodeServerApplication

注意,您必须非常注意成员名称(使用spring.data.gemfire.name属性,因为GemFire要求对等成员名称是唯一的),并且您必须更改CacheServer端口(由缓存客户端用于连接;因此具有spring.data.gemfire.cache.server.port属性),否则您将遇到java.net.BindException,因为默认情况下CacheServer监听端口40404

众所周知的SDG(系统)属性是更改配置并运行小型集群的最简单方法(甚至没有 Gfsh ;很酷!)。