有没有一种好方法可以检查datastax session.executeasync()是否引发了异常?

sf6xfgos  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(342)

我想通过打电话来加速我们的代码 session.executeAsync() 而不是 session.execute() 对于db写入。
我们有db连接可能中断的用例,目前是前一个 execute() 连接丢失时引发异常(群集中没有可访问的主机)。我们可以捕获这些异常,然后重试或将数据保存到其他地方等等。。。
executeAsync() ,看起来没有任何方法来实现这个用例-返回的 ResultSetFuture 需要访问对象来检查结果,这将破坏使用 executeAsync() 首先。。。
有没有办法在任何地方为executeasync()调用添加一个侦听器(或类似的东西),该调用将异步通知其他一些代码db write失败?
这有关系吗?datastax 1.0.2 java 1.7.40

envsm3lx

envsm3lx1#

你可以试试这样的 ResultSetFuture 工具 ListenableFuture 来自guava图书馆:

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);
        }
    });

此方法不会阻止您的应用程序。

qltillow

qltillow2#

您可以将回调传递给该方法以对异常执行操作。如果你需要 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);
}

相关问题