有没有直接的方法来检查群集/会话是否已连接/有效/确定?
我的意思是,我有一个com.datastax.driver.core.Session创建到一个无休止的线程中,我想确保每次都需要会话。我使用下一个集群初始化,但我不确定这是否足够......
Cluster.builder().addContactPoint(url)
.withRetryPolicy(DowngradingConsistencyRetryPolicy.INSTANCE)
.withReconnectionPolicy(new ConstantReconnectionPolicy(1000L)).build());
答案 0 :(得分:2)
事实上,在使用DataStax Java驱动程序时,您可以嵌入隐藏/魔法功能:
驱动程序知道完整的网络拓扑(跨数据中心和节点可用性的节点拓扑)。
因此,您唯一需要做的就是使用几个节点( 1 )初始化集群,然后您可以确保每时每刻至少有一个可用节点请求将正确执行。由于驱动程序可识别拓扑,因此如果一个节点(甚至初始化节点)超出可用性,驱动程序将自动将您的请求路由到另一个可用节点。
总之,您的代码很好( 1 )。
( 1 ):您应该提供一些节点,以便在群集初始化阶段具有容错能力。实际上,如果一个初始化节点关闭,那么驱动程序就有可能联系另一个初始化节点以发现完整的拓扑结构。
答案 1 :(得分:0)
我有一个本地开发环境设置,其中同时启动了Java应用程序和Cassandra(Docker)容器,因此当Java应用程序首次尝试连接时,Cassandra通常不会处于就绪状态。
在启动时,当NoHostAvailableException
实例尝试创建Cluster
时,应用程序将抛出Session
。随后从Session
创建Cluster
的尝试将抛出IllegalStateException
,因为在第一个异常之后群集实例已关闭。
为此,我要做的是创建一个检查方法,该方法尝试创建一个Cluster和Session,然后立即将其关闭。看到这个:
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
。