2017-09-24 93 views
2

我正在使用withRemote将我的java应用程序连接到AWS上运行的gremlin服务器,后者使用dynamodb存储后端。我正在连接超时几秒钟(〜3.3秒)后:Gremlin服务器与远程连接关闭 - 如何自动重新连接?

org.apache.tinkerpop.gremlin.process.remote.RemoteConnectionException: java.lang.RuntimeException: java.util.concurrent.ExecutionException: java.nio.channels.ClosedChannelException]]

我需要弄清楚如何重新连接,这意味着如果连接被关闭检测。我不知道如何检测。当我使用图遍历时,是否有一种方法可以在之前发现它并重新连接,或者在配置中有一个允许自动重新连接的选项(如在此关闭之前创建新连接),以便我的应用程序始终连接?

在你需要的情况下,这是我正在做的连接 - 目前连接部分是单应用程序启动时:

this.graph = EmptyGraph.instance(); 
    GryoMessageSerializerV1d0 gryoMessageSerializerV1d0 = new GryoMessageSerializerV1d0(
     GryoMapper.build().addRegistry(JanusGraphIoRegistry.getInstance())); 
    this.cluster = Cluster.build().serializer(gryoMessageSerializerV1d0) 
     .addContactPoint(configuration.getString("graphDb.host", "localhost")) 
     .port(configuration.getInt("graphDb.port", 8182)).create(); 
    this.graphTraversalSource = this.graph.traversal().withRemote(DriverRemoteConnection.using(cluster)); 
+1

我会首先尝试找出连接丢失发生的原因。另外,我正在删除DynamoDB标记,因为问题与它无关。 –

+0

我想出了为什么我的连接丢失正在发生。我的AWS负载均衡器TCP理想超时时间为60秒,我的大多数gremlin调用都是在不从gremlin服务器返回任何内容的情况下创建数据,因此超时。我仍然需要弄清楚如何在进行任何gremlin请求之前检查连接是否仍处于活动状态,如果连接未处于活动状态,请重新连接 - 任何人都知道如何检查该连接? – monali01

回答

2

我觉得这个问题已经与connection.keepAliveconfiguration option解决。默认为180秒,因此它比负载均衡器中60秒的超时长,这就是它放弃的原因。

也就是说,驱动程序应该自行重新连接。它不断试图做到这一点,给予connectionPool.reconnectInterval,但也许有一种情况下,你很快耗尽所有的连接,以获得该错误....不知道。无论哪种方式,希望

+0

“,但也许有一种情况是,您很快就会耗尽所有连接以获得该错误” - 允许多少个总连接? 另外,我注意到,如果我使用不同的连接每个请求,它上升到~1869连接,然后服务器开始抛出这个例外: [gremlin-server-boss-1]警告io.netty.channel.DefaultChannelPipeline - 一个exceptionCaught()事件被触发,并到达管道尾部。它通常意味着管道中的最后一个处理程序不处理该异常。 java.io.IOException:打开的文件太多 – monali01

+0

this.graphTraversalSource = this.graph.traversal()。withRemote(DriverRemoteConnection.using(cluster)); // g.V()。addV().....请求 this.graphTraversalSource.close() this.graphTraversalSource = this.graph.traversal()。withRemote(DriverRemoteConnection.using(cluster)); // GV()。ADDV().....要求 this.graphTraversalSource.close() 等环 – monali01

+1

,我不知道有多少可以被允许的,我只是意味着,无论你客户端连接池配置为可能已耗尽。 “太多打开的文件”是一个相当常见的Linux错误 - 如果你在谷歌搜索这个短语,你会得到一堆解决方案。当我在该评论中查看代码时,我可以看到为什么服务器显示如此多的打开连接。不需要像这样反复重新创建'TraversalSource'。只需执行一次 - g = graph.traversal()。withRemote(...)'并重新使用'g'。 –

相关问题