我有一个本地开发环境设置,我正在同时启动我的 java 应用程序和 Cassandra (Docker) 容器,因此当 java 应用程序第一次尝试连接时,Cassandra 通常不会处于就绪状态。
当它启动时,应用程序将NoHostAvailableException
在Cluster
实例尝试创建Session
. 随后尝试Session
从中创建一个Cluster
然后会抛出一个,IllegalStateException
因为集群实例在第一个异常之后关闭。
我所做的补救措施是创建一个检查方法,该方法尝试创建一个集群和会话,然后立即关闭它们。看到这个:
private void waitForCassandraToBeReady(String keyspace, Cluster.Builder builder) {
RuntimeException exception = null;
int retries = 0;
while (retries++ < 40) {
Session session = null;
Cluster cluster = null;
try {
cluster = builder.build();
session = cluster.connect(keyspace);
log.info("Cassandra is available");
return;
} catch (RuntimeException e) {
log.warn("Cassandra not available, try {}", retries);
exception = e;
} finally {
if (session != null && !session.isClosed()) session.close();
if (cluster != null && !cluster.isClosed()) cluster.close();
}
sleep();
}
log.error("Retries exceeded waiting for Cassandra to be available");
if (exception != null) throw exception;
else throw new RuntimeException("Cassandra not available");
}
在这个方法返回之后,我再创建一个创建一个Cluster
并且Session
独立于这个检查方法。