启动时重试与Cassandra节点的连接

Vla*_*eev 26 java cassandra

我想使用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)
Run Code Online (Sandbox Code Playgroud)

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

gst*_*ner 12

您应该能够在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;
}
Run Code Online (Sandbox Code Playgroud)