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

5
如何告诉Datastax Java Cassandra驱动程序在尝试连接到群集时超时?特别是当主机可达,但Cassandra端口被阻止或Cassandra守护程序未运行的情况下。我正在编写一个命令行客户端,如果在合理的时间内无法连接,则应退出并报告适当的错误消息。目前,如果可达联系点,驱动程序将永远等待联系点响应。也就是说,如果驱动程序无法与任何联系点的Cassandra守护程序通信,则希望Cluster.build()在给定的最大时间内抛出NoHostAvailableException。请保留html标记。
  • 创建自己的 RetryPolicy 不起作用: 这是为了重试查询,而我想要在我们准备运行查询之前应用超时。
  • 创建自己的 ReconnectionPolicy 最初看起来很有前途,但接口的契约没有提供指示“将此节点视为永久死亡”的手段。
1个回答

7
即我想让Cluster.build()在给定的最长时间内无法与任何联系点的Cassandra守护程序通信时抛出NoHostAvailableException异常。
这应该是可以实现的。驱动程序将尝试连接每个联系点,如果连接失败,则会抛出异常。您可以通过SocketOptions.setConnectTimeoutMillis()控制驱动程序尝试连接(到每个节点)的最长时间(默认为5秒)。
我的经验是,如果没有节点可以连接,Cluster.build()确实会返回异常,但如果您的经验不同,您可能需要将其报告为错误(但更详细地说明如何重现此错误会有所帮助)。
话虽如此:
上面的超时时间是每个主机的超时时间。因此,如果您传递了100个联系点的列表,则在默认情况下,您可以理论上等待500秒才会收到NoHostAvailableException异常。但是提供那么多联系点没有实际意义,在实践中,如果Cassandra在尝试的节点上没有运行,则连接尝试通常会立即失败(您不必等待超时时间)。
目前驱动程序端没有真正的查询超时时间。这意味着,如果驱动程序确实连接到一个节点(这意味着某些进程正在监听该端口并接受连接),但无法得到对其初始消息的答复,则它确实可能永远保持连接状态。这应该修复,并鼓励您在https://datastax-oss.atlassian.net/browse/JAVA上开票解决。然而,这似乎不是您所描述的情况,因为如果“Cassandra端口被阻止或Cassandra守护程序未运行”,则驱动程序首先就无法连接。

可能我实际上看到的是第二种情况。我可能错过了那个套接字选项。正如你所暗示的,这对大多数情况应该足够了。 - Raedwald
@Raedwald,你是否为这个问题提交了错误报告,或者有更简单的解决方案? - Desert Ice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接