2013-07-16 10 views
5

クラスタに接続しようとすると、Datastax Java Cassandraドライバにタイムアウトする方法を教えてください。Datastax Java Cassandraドライバにクラスタ接続のタイムアウトを依頼する

私はホストが到達可能である場合に特に興味があるんだけど、カサンドラのポートがブロックされているか、カサンドラデーモンが実行されていません。私は妥当な時間に接続できない場合は、終了し、適切なエラーメッセージを報告するコマンドラインクライアントを作成しています。現在のところ、運転手は、接触ポイントが到達可能である場合、応答への接触ポイントを永遠に待つように見える。

つまり、ドライバが特定の最大時間内に任意の接点のCassandraデーモンと通信できない場合、Cluster.build()NoHostAvailableExceptionを送信します。

  • RetryPolicyが動作しません私自身の作成:それは再試行クエリのためである、と私たちはクエリを実行する準備ができている前にタイムアウトを適用したいと。
  • )(私自身ReconnectinoPolicyは、最初は有望に見えたが、インタフェースのための契約がある

答えて

7

、私はCluster.buildをしたい「永遠より死んだように、このノードを考える」を示すための手段を与えないの作成ドライバが指定された最大時間内にいずれかの接点のCassandraデーモンと通信できない場合、NoHostAvailableExceptionをスローする

これはケースのようになっています。ドライバは各接点に接続しようとし、いずれかに接続できない場合は例外をスローします。 SocketOptions.setConnectTimeoutMillis()を使用して(各ノードに)接続しようとする最大時間を制御できます(デフォルトは5秒です)。

私の経験では、ノードが接続できない場合はCluster.build()が例外を返しますが、経験が異なる場合は、バグとして報告することをお勧めします(ただし、再現方法の詳細これは助けになるだろう)。

  • 上記タイムアウトがホストあたりである:言われていること

    。したがって、100個の接触点のリストを渡すと、理論的にはNoHostAvailableExceptionを取得する前に500秒(デフォルト)を待たなければなりません。しかし、実際には、Cassandraが試行されたノードで実行されていないと、通常はすぐに接続が失敗します(タイムアウトを待つことはありません)。

  • 現在、ドライバ側では実際のクエリタイムアウトはありません。これは、ドライバがノードに接続した場合(すなわち、のプロセスがそのポートでリスンして接続を受け入れることを意味しますが)、最初のメッセージに応答がない場合は、永遠に保持できます。それはおそらく修正されるべきで、https://datastax-oss.atlassian.net/browse/JAVAのチケットを開くことをお勧めします。しかし、「Cassandraポートがブロックされているか、Cassandraデーモンが実行されていない」場合、ドライバは最初に接続できないはずであるため、説明しているようなことはありません。
+0

私は実際に2番目のケースを見ている可能性があります。私はそのソケットオプションを忘れてしまった。あなたが示唆しているように、それはほとんどの場合十分なはずです。 – Raedwald

+0

@ Raedwald、この問題のバグを報告しましたか、それとも簡単な解決策がありましたか? –

関連する問題