我想使用 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是否有某些限制,使得我无法通过这种方式连接?
答案 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
实例不能设置locators
和mcast-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 ;很酷!)。