在为executeAsync指定的超时之前,Cassandra drop keyspace会抛出timeoutexception

时间:2018-06-14 06:53:37

标签: java cassandra cassandra-driver

我在删除键空间的同时获得了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);

我不确定这是否是以编程方式增加超时的正确方法。如果有其他好的方法,请告诉我。

1 个答案:

答案 0 :(得分:1)

最好不要同时进行多项修改(就像你通过executeAsync做的那样)。当您在分布式系统中修改模式时,模式更改应该已解决,并且所有节点之间应该达成一致。

我建议修改代码以通过session.execute而不是异步版本执行命令。完成所有操作后检查架构协议 - Metadata类中有相应的方法。