2017-09-24 20 views
2

私はwithRemoteを使用して、JavaアプリケーションをDynamodbストレージバックエンドを使用してAWSで実行されているgremlinサーバーに接続しています。私は、数秒(〜3.3秒)の後に接続タイムアウトを取得しています:私は、接続が閉じているかどうかを検出することを意味する再接続する方法を把握する必要がありGremlinサーバーwithリモート接続 - 自動的に再接続する方法?

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の接続とは、サーバは、この例外を投げ始めた。 [グレムリン-サーバボス-1]はio.netty.channel.DefaultChannelPipeline WARN - アンをexceptionCaught()イベントが発生し、パイプラインの末尾に到達しました。これは通常、パイプラインの最後のハンドラが例外を処理しなかったことを意味します。 にjava.io.IOException:開いているファイルが多すぎます – monali01

+0

this.graphTraversalSource = this.graph.traversal()withRemote(DriverRemoteConnection.using(クラスター)); // g.V()。addV()..... request this.graphTraversalSource.close() this.graphTraversalSource = this.graph.traversal()。withRemote(DriverRemoteConnection.using(cluster)); // GV()。ADDV()..... this.graphTraversalSource.close() を要求し、そのループ – monali01

+1

に私が許可することができますどのように多くのか分からないが、私はちょうどその何でもあなたの意味しましたクライアント接続プールが構成されている可能性があります。 「開いているファイルが多すぎます」というのはLinuxの一般的なエラーです。Googleでそのフレーズを検索すると、たくさんのソリューションが得られます。私はそのコメントであなたのコードを見て、私はなぜサーバーが非常に多くのオープンな接続を表示しているかを見ることができます。そのような "TraversalSource"を何度も再作成する必要はありません。 'g = graph.traversal()。withRemote(...)'を一度実行し、 'g'を再利用してください。 –

関連する問題