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

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

我想通过打电话来加速我们的代码 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图书馆:

  1. ResultSetFuture resultSetFuture = session.executeAsync("SELECT * FROM test.t;");
  2. Futures.addCallback(resultSetFuture, new FutureCallback<ResultSet>() {
  3. @Override
  4. public void onSuccess(@Nullable com.datastax.driver.core.ResultSet resultSet) {
  5. // do nothing
  6. }
  7. @Override
  8. public void onFailure(Throwable throwable) {
  9. System.out.printf("Failed with: %s\n", throwable);
  10. }
  11. });

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

qltillow

qltillow2#

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

  1. interface ResultSetFutureHandler {
  2. void handle(ResultSetFuture rs);
  3. }
  4. public void catchException(ResultSetFutureHandler handler) {
  5. ResultSetFuture resultSet = null;
  6. try {
  7. resultSet = getSession().executeAsync(query);
  8. for (Row row : results.getUninterruptibly()) {
  9. // do something
  10. }
  11. } catch (RuntimeException e) {
  12. handler.handle(resultSet); // resultSet may or may not be null
  13. }
  14. }

那就这样称呼吧:

  1. catchException(new ResultSetFutureHandler() {
  2. void handle(ResultSetFuture resultSet) {
  3. // do something with the ResultSetFuture
  4. }
  5. });

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

  1. interface ResultSetFutureHandler {
  2. void handle(ResultSetFuture rs, RuntimeException e);
  3. }
展开查看全部

相关问题