我正在尝试通过调用session.executeAsync()
代替session.execute()
进行数据库写入来加速我们的代码。
我们遇到数据库连接可能已关闭的用例,当前前一个execute()
会在连接丢失时抛出异常(群集中无法访问主机)。我们可以捕获这些异常并重试或将数据保存在其他地方等...
使用executeAsync()
,看起来没有任何方法可以实现此用例 - 需要访问返回的ResultSetFuture
对象以检查结果,这将无法使用executeAsync()
首先......
有没有办法在executeAsync()调用的任何地方添加一个侦听器(或类似的东西),它会异步通知一些其他代码,因为DB写入失败了?
这是否相关? Datastax 1.0.2 Java 1.7.40
答案 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);
}