2013-07-16 74 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,你是否为这个问题提出了错误,或者是否有更简单的解决方案? –

相关问题