有没有一种好方法可以检查Datastax Session.executeAsync()是否抛出了异常?

时间:2014-03-11 10:10:03

标签: java datastax datastax-java-driver

我正在尝试通过调用session.executeAsync()代替session.execute()进行数据库写入来加速我们的代码。

我们遇到数据库连接可能已关闭的用例,当前前一个execute()会在连接丢失时抛出异常(群集中无法访问主机)。我们可以捕获这些异常并重试或将数据保存在其他地方等...

使用executeAsync(),看起来没有任何方法可以实现此用例 - 需要访问返回的ResultSetFuture对象以检查结果,这将无法使用executeAsync()首先......

有没有办法在executeAsync()调用的任何地方添加一个侦听器(或类似的东西),它会异步通知一些其他代码,因为DB写入失败了?

这是否相关? Datastax 1.0.2 Java 1.7.40

2 个答案:

答案 0 :(得分:14)

你可以尝试这样的事情,因为ResultSetFuture实现了来自Guava库的ListenableFuture

    ResultSetFuture resultSetFuture = session.executeAsync("SELECT * FROM test.t;");
    Futures.addCallback(resultSetFuture, new FutureCallback<ResultSet>() {
        @Override
        public void onSuccess(@Nullable com.datastax.driver.core.ResultSet resultSet) {
            // do nothing
        }

        @Override
        public void onFailure(Throwable throwable) {
            System.out.printf("Failed with: %s\n", throwable);
        }
    });

此方法不会阻止您的申请。

答案 1 :(得分:1)

您可以将回调传递给方法以对异常执行操作。如果你需要ResultSetFuture,你可以尝试这样的事情:

interface ResultSetFutureHandler {
    void handle(ResultSetFuture rs);
}

public void catchException(ResultSetFutureHandler handler) {
    ResultSetFuture resultSet = null;
    try {
        resultSet = getSession().executeAsync(query);
        for (Row row : results.getUninterruptibly()) {
            // do something
        }
    } catch (RuntimeException e) {
        handler.handle(resultSet); // resultSet may or may not be null
    }
}

然后这样称呼:

catchException(new ResultSetFutureHandler() {
    void handle(ResultSetFuture resultSet) {
        // do something with the ResultSetFuture
    }
});

如果您需要知道异常是什么,也可以添加一个异常参数:

interface ResultSetFutureHandler {
    void handle(ResultSetFuture rs, RuntimeException e);
}