gpt4 book ai didi

java - 启动时重试连接到 Cassandra 节点

转载 作者:IT老高 更新时间:2023-10-28 21:20:02 26 4
gpt4 key购买 nike

我想使用 Docker 来启动我的应用程序和 Cassandra 数据库,并且我想为此使用 Docker Compose。不幸的是,Cassandra 的启动速度比我的应用程序慢得多,并且由于我的应用程序急切地初始化 Cluster 对象,我得到以下异常:

com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: cassandra/172.18.0.2:9042 (com.datastax.driver.core.exceptions.TransportException: [cassandra/172.18.0.2:9042] Cannot connect))
at com.datastax.driver.core.ControlConnection.reconnectInternal(ControlConnection.java:233)
at com.datastax.driver.core.ControlConnection.connect(ControlConnection.java:79)
at com.datastax.driver.core.Cluster$Manager.init(Cluster.java:1454)
at com.datastax.driver.core.Cluster.init(Cluster.java:163)
at com.datastax.driver.core.Cluster.connectAsync(Cluster.java:334)
at com.datastax.driver.core.Cluster.connectAsync(Cluster.java:309)
at com.datastax.driver.core.Cluster.connect(Cluster.java:251)

根据堆栈跟踪和一点调试,Cassandra Java 驱动程序似乎没有将重试策略应用于初始启动。这对我来说似乎有点奇怪。有没有办法让我配置驱动程序,让它继续尝试连接到服务器,直到成功?

最佳答案

您应该能够在 NoHostAvailableException 上编写一些 try/catch 逻辑,以便在等待 5-10 秒后重试连接。我建议只执行几次,然后在您知道它应该在那个时间点开始的特定时间段之后引发异常。

示例伪代码

Connection makeCassandraConnection(int retryCount) {
Exception lastException = new IllegalStateException();
while (retryCount > 0) {
try {
return doConnectionStuff();
} catch (NoHostAvailableException e) {
lastException = e;
retryCount--;
Thread.sleep(TimeUnit.SECONDS.toMillis(5));
}
}
throw lastException;
}

关于java - 启动时重试连接到 Cassandra 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38723896/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com