根据我的问题Apache Geode Web framework,我检查了here中的各种弹簧指南和here中的spring数据geode样本,并编写了一个简短的spring data geode应用程序,但无法连接到远程GFSH启动了Geode定位器。 Application类是:
<div class = 'level_1'>
<div class = 'level_2'>
<div class = 'level_31'></div>
<div class = 'level_32'></div>
<div class = 'level_33'></div>
<div class = 'level_special'></div>
</div>
</div>
<div class = 'level_1'>
<div class = 'level_2'>
<div class = 'level_31'></div>
<div class = 'level_32'></div>
<div class = 'level_33'></div>
</div>
</div>
并在资源目录package cm;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.gemfire.config.annotation.ClientCacheApplication;
import org.springframework.data.gemfire.config.annotation.ClientCacheApplication.Locator;
import org.springframework.data.gemfire.config.annotation.EnablePdx;
import org.springframework.data.gemfire.repository.config.EnableGemfireRepositories;
@SpringBootApplication
@ClientCacheApplication(name = "CmWeb", locators = @Locator, subscriptionEnabled = true)
@EnableGemfireRepositories(basePackageClasses= {CmRequest.class})
@EnablePdx
public class CmWeb {
public static void main(String[] args) {
SpringApplication.run(CmWeb.class, args);
}
}
中设置了远程定位器:
application.properties
构建并运行该应用程序,它会发现定位器(它将作为服务器名称返回)
# Configure the client's connection Pool to the servers in the cluster
spring.data.gemfire.pool.locators=1.2.3.4[10334]
几秒钟后,它引发错误:
[Timer-DEFAULT-2] o.a.g.c.c.i.AutoConnectionSourceImpl : AutoConnectionSource discovered new locators [UAT:10334]
和
[Timer-DEFAULT-2] o.a.g.c.c.i.AutoConnectionSourceImpl : locator UAT:10334 is not running.
经过大量调查,我认为这是spring数据geode客户端希望使用符合Connecting GemFire using Spring Boot and Spring Data GemFire的spring boot geode服务器,因此我下载了ListRegionsOnServerFunction jar并将其部署到GFSH服务器上得到了相同的结果(尚未重新启动服务器...),但这会导致相同的错误情况。
如果通过Spring-Data-Gemfire - Unable to contact a Locator service. Operation either timed out or Locator does not exist,我尝试从以下位置更改application.properties
java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) ~[na:1.8.0_232]
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) ~[na:1.8.0_232]
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_232]
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:204) ~[na:1.8.0_232]
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_232]
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) ~[na:1.8.0_232]
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_232]
at java.net.Socket.connect(Socket.java:607) ~[na:1.8.0_232]
at org.apache.geode.internal.net.SocketCreator.connect(SocketCreator.java:958) ~[geode-core-1.9.2.jar:na]
at org.apache.geode.internal.net.SocketCreator.connect(SocketCreator.java:899) ~[geode-core-1.9.2.jar:na]
at org.apache.geode.internal.net.SocketCreator.connect(SocketCreator.java:888) ~[geode-core-1.9.2.jar:na]
at org.apache.geode.distributed.internal.tcpserver.TcpClient.getServerVersion(TcpClient.java:290) ~[geode-core-1.9.2.jar:na]
at org.apache.geode.distributed.internal.tcpserver.TcpClient.requestToServer(TcpClient.java:184) ~[geode-core-1.9.2.jar:na]
at org.apache.geode.cache.client.internal.AutoConnectionSourceImpl.queryOneLocatorUsingConnection(AutoConnectionSourceImpl.java:209) [geode-core-1.9.2.jar:na]
at org.apache.geode.cache.client.internal.AutoConnectionSourceImpl.queryOneLocator(AutoConnectionSourceImpl.java:199) [geode-core-1.9.2.jar:na]
at org.apache.geode.cache.client.internal.AutoConnectionSourceImpl.queryLocators(AutoConnectionSourceImpl.java:287) [geode-core-1.9.2.jar:na]
at org.apache.geode.cache.client.internal.AutoConnectionSourceImpl$UpdateLocatorListTask.run2(AutoConnectionSourceImpl.java:500) [geode-core-1.9.2.jar:na]
at org.apache.geode.cache.client.internal.PoolImpl$PoolTask.run(PoolImpl.java:1371) [geode-core-1.9.2.jar:na]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_232]
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) [na:1.8.0_232]
at org.apache.geode.internal.ScheduledThreadPoolExecutorWithKeepAlive$DelegatingScheduledFuture.run(ScheduledThreadPoolExecutorWithKeepAlive.java:276) [geode-core-1.9.2.jar:na]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_232]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_232]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_232]
到
spring.data.gemfire.pool.locators=1.2.3.4[10334]
或其他版本,则应用无法找到远程定位器并抛出:
spring.gemfire.locators=1.2.3.4[10334]
提出这个问题,我终于找到了How to connect a remote-locator in Geode,也无法从SPRING应用程序PING GFSH服务器。但是,服务器绑定地址是为远程定位器客户端和各种其他服务正确设置的,并且可以使用本地构建的Geode v 1.10的Geode Native Client进行UI连接。我怀疑默认情况下,此(半内部)网络可能会禁用PING。我还禁用了端口10334、1099、40404的防火墙规则,以允许所有流量,但仍然会遇到相同的错误情况。
事实证明,从Spring Boot应用程序 之后重复的INFO消息中,连接被拒绝:
[Timer-DEFAULT-3] o.a.g.c.c.i.AutoConnectionSourceImpl : locator localhost/127.0.0.1:10334 is not running.
,然后在服务器上运行[Timer-DEFAULT-2] o.a.g.c.c.i.AutoConnectionSourceImpl : updateLocatorInLocatorList changing locator list: loc form: LocatorAddress [socketInetAddress=UAT:10334, hostname=UAT, isIpString=false] ,loc to: UAT:10334
[Timer-DEFAULT-2] o.a.g.c.c.i.AutoConnectionSourceImpl : updateLocatorInLocatorList locator list from:[UAT:10334, /1.2.3.4:10334] to: [LocatorAddress [socketInetAddress=UAT:10334, hostname=UAT, isIpString=false], LocatorAddress [socketInetAddress=/1.2.3.4:10334, hostname=1.2.3.4, isIpString=true]]
,实际上已经建立了从Spring Boot应用程序到Geode服务器v 1.10的连接。啊!
虽然并没有解释为什么list clients
错误。
答案 0 :(得分:1)
关于Spring Boot应用程序类的1条简短说明...
@SpringBootApplication
@ClientCacheApplication(name = "CmWeb", locators = @Locator, subscriptionEnabled = true)
@EnableGemfireRepositories(basePackageClasses= {CmRequest.class})
@EnablePdx
public class CmWeb {
public static void main(String[] args) {
SpringApplication.run(CmWeb.class, args);
}
}
如果强烈建议使用 Apache Geode的Spring Boot (或Pivotal GemFire),则以下说法是正确的。
使用SBDG时(通过在应用程序类路径上声明正确的org.springframework.geode:spring-geode-starter
依赖性),则无需显式声明@ClientCacheApplication
,@EnableGemfireRepositories
或@EnablePdx
注释,因为SBDG默认情况下会自动配置ClientCache
实例,所以会自动配置SD存储库,尤其是当所有实体类与Spring Boot应用程序位于同一包或子包中且SBDG默认情况下会自动配置PDX时,好吧。
locator = @Locator
仅指定在通过Pool
进行配置时,“ DEFAULT” GemFire / Geode ClientCacheFactory
应该使用默认设置通过localhost
上的定位器连接到集群。定位器端口10334
。因此,该属性几乎没有用,我建议使用SBDG的 new @EnableClusterAware
注释(请参见here)。
其他属性可以通过Spring Boot application.properties
进行配置,如下所示:
spring.application.name=CmWeb
spring.data.gemfire.pool.subscription-enabled=true
提示:如果您在应用程序中使用的连接数超过
Pools
,则可以通过属性单独配置“Pool
”上的订阅,也许可以基于到群集中不同“分组”服务器的工作流等上。
您已经开始使用...来配置application.properties中的“ DEFAULT” Pool
。
# Configure the client's connection Pool to the servers in the cluster
spring.data.gemfire.pool.locators=1.2.3.4[10334]
关于...
经过大量调查,我认为这是spring数据geode客户端期望使用spring boot geode服务器
否,SDG根本不希望使用Spring配置或引导(服务器的)集群。使用Gfsh是完全有效的。对于instance。如果ListRegionsOnServerFunction
不可用,SDG将退回到其他方式(由Gfsh知道并使用的GemFire / Geode本身提供)。
您在Spring Boot应用程序日志中看到的所有消息均来自Geode本身,即与Spring无关。简而言之,FWIW,SDG / SBDG是围绕Apache Geode(关键GemFire)API和Java客户端驱动程序的外观。 SDG / SBDG受此客户端的约束,只能做正确的事,这当然部分取决于正确的配置。仍然……我真的只是在想一想,因为我怀疑您已经充分意识到(或发现)了所有这一切。
我还要说Java客户端和Native Client也不完全是Apple与Apple的比较。意思是,如果您仅使用不带Spring的Apache Geode(Pivotal GemFire)API开发了一个客户端,那么您将遇到完全相同的问题。
我从未见过建立第一个连接,但随后的连接却收到“连接被拒绝”的情况,噢,#argh
您是否曾尝试对较旧的Geode版本进行相同的配置/安排,例如1.9?
很抱歉给您带来麻烦。我会考虑更多。