告诉Datastax Java Cassandra驱动程序超时集群连接

时间:2013-07-16 15:04:22

标签: java cassandra datastax-java-driver

如何判断Datastax Java Cassandra驱动程序在尝试连接到您的群集时是否超时?

我对主机可以访问的情况特别感兴趣,但是Cassandra端口被阻塞或者Cassandra守护进程没有运行。我正在编写一个命令行客户端,如果它无法在合理的时间内连接,它应该退出并报告合适的错误消息。目前,如果联系点可以到达,驱动程序似乎将永远等待接触点响应。

也就是说,如果驱动程序无法在给定的最长时间内与任何联系点的Cassandra守护进程通信,我希望Cluster.build()抛出NoHostAvailableException

  • 创建我自己的RetryPolicy将不起作用:这是为了重试查询,我希望超时在之前应用我们准备好运行查询。
  • 创建我自己的ReconnectinoPolicy最初看起来很有希望,但是接口的合同没有提供任何方法来表明“认为这个节点永远死了”

1 个答案:

答案 0 :(得分:7)

  

也就是说,如果驱动程序无法在给定的最长时间内与任何联系点的Cassandra守护程序通信,我希望Cluster.build()抛出NoHostAvailableException。

应该是这种情况。驱动程序将尝试连接到每个联系点,如果无法连接到任何联系点,则抛出异常。您可以通过SocketOptions.setConnectTimeoutMillis()控制驱动程序尝试连接(到每个节点)的最长时间(默认值为5秒)。

我的经验是,如果没有节点可以连接,Cluster.build()确实会返回异常,但是如果您的体验不同,您可能希望将其报告为错误(但有关如何重现此更多细节)会有所帮助。)

话虽如此:

  • 上面的超时是每个主机。因此,如果您传递100个联系点的列表,理论上您必须等待500秒(默认情况下)才能获得NoHostAvailableException。但是提供那么多接触点没有任何意义,实际上,如果Cassandra没有在尝试的节点上运行,连接尝试通常会立即失败(你不会等待超时)。
  • 目前驱动程序端没有真正的查询超时。这意味着如果驱动程序确实连接到一个节点(这意味着某些进程正在侦听该端口并接受连接),但是没有得到他的初始消息的答案,那么它确实可以永久保存。这应该是固定的,我鼓励你在https://datastax-oss.atlassian.net/browse/JAVA打开一张票。但是,这似乎不是您所描述的情况,因为如果“Cassandra端口被阻止或Cassandra守护程序未运行”,则驱动程序应该无法首先连接。