2013-07-16 70 views
5

如何讓Datastax Java Cassandra驅動程序在嘗試連接到集羣時超時?Tell Datastax Java Cassandra驅動程序超時集羣連接

我對主機可達的情況特別感興趣,但Cassandra端口被阻塞或者Cassandra守護進程未運行。我正在編寫一個命令行客戶端,如果它在合理的時間內無法連接,應該退出並報告合適的錯誤消息。目前看來,如果接觸點可達,駕駛員將永遠等待接觸點回應。

也就是說,如果驅動程序無法在給定的最大時間內與任何接觸點的Cassandra守護進程通信,我希望Cluster.build()拋出NoHostAvailableException

  • 創建我自己的RetryPolicy將無法​​正常工作:即對重試查詢,我想超時申請之前,我們已經準備好運行查詢。
  • 創建我自己的ReconnectinoPolicy最初看起來前途無量,但對於接口的合同沒有給出裝置,用於指示「考慮這個節點是死永遠地」

回答

7

也就是說,我想Cluster.build()如果驅動程序無法在給定的最大時間內與任何聯繫點的Cassandra守護程序通信,則拋出NoHostAvailableException。

這應該是這種情況。驅動程序將嘗試連接到每個聯繫點,並在它無法連接到任何聯繫點時拋出異常。您可以控制驅動程序通過SocketOptions.setConnectTimeoutMillis()嘗試連接(到每個節點)的最長時間(默認值爲5秒)。

我的經驗是,如果沒有節點可以連接,Cluster.build()確實會返回一個異常,但是如果你的體驗不同,你可能想要將它報告爲一個bug(但是有關你如何重現的更多細節這會有所幫助)。

這就是說:

  • 上述超時是每個主機。因此,如果您傳遞100個聯繫點列表,理論上在獲取NoHostAvailableException之前必須等待500秒(默認情況下)。但是提供這麼多聯繫點並沒有真正的意義,並且在實踐中,如果Cassandra沒有在節點上運行,連接嘗試通常會立即失敗(您不會等待超時)。
  • 驅動器端目前沒有真正的查詢超時。這意味着如果驅動程序確實連接到一個節點(這意味着某些進程正在偵聽該端口並接受連接),但沒有回答他的初始消息,那麼它確實可以永久保存。這可能應該是固定的,我鼓勵你在https://datastax-oss.atlassian.net/browse/JAVA上打開一張票。但是,這似乎並不是你所描述的情況,因爲如果「Cassandra端口被阻塞或者Cassandra守護進程沒有運行」,那麼驅動程序首先應該無法連接。
+0

這是可能的,我實際上看到第二個案例。我必須錯過那個套接字選項。正如你所暗示的那樣,在大多數情況下,這應該足夠好。 – Raedwald

+0

@Raedwald,你是否爲這個問題提出了錯誤,或者是否有更簡單的解決方案? –

相關問題