我在删除键空间的同时获得了cassandra OperationTimedOutException
。虽然我已经阻止 60000毫秒(1分钟) timeOut
阻止,直到我从cassandra Future
获得executeAsync
个对象。但是立即抛出timeoutexception
而没有等待完整的1分钟。
这就是我使用java -
删除键空间的方法List<KeyspaceMetadata> keyspaceMetadataList = cluster.getMetadata().getKeyspaces();
for(KeyspaceMetadata ks: keyspaceMetadataList)
{
if (ks.getName().startsWith("system"))
{
continue;
}
try
{
session.executeAsync("drop keyspace " + ks.getName()).get(1000 * 60, TimeUnit.MILLISECONDS);
log.info("Dropped Keyspace: " + ks.getName());
}
catch( InterruptedException | ExecutionException | TimeoutException e )
{
log.error("Something went wrong: " + e);
}
}
你可以看到下面给出的行,我强烈告诉呼叫等待至少60秒,但在此之前,我得到了TimeOutException
。
session.executeAsync("drop keyspace " + ks.getName()).get(1000 * 60, TimeUnit.MILLISECONDS);
我不确定这是否是以编程方式增加超时的正确方法。如果有其他好的方法,请告诉我。
答案 0 :(得分:1)
最好不要同时进行多项修改(就像你通过executeAsync
做的那样)。当您在分布式系统中修改模式时,模式更改应该已解决,并且所有节点之间应该达成一致。
我建议修改代码以通过session.execute
而不是异步版本执行命令。完成所有操作后检查架构协议 - Metadata
类中有相应的方法。