2017-09-24 219 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'。 –