首页 文章

使用Java编写带有Akka可能失败的未来

提问于
浏览
0

我正在尝试将未来的构图概念应用到我自己的应用程序中 . 根据Akka文档,你可以这样做(http://doc.akka.io/docs/akka/snapshot/java/futures.html):

final ExecutionContext ec = system.dispatcher();
//Some source generating a sequence of Future<Integer>:s
Iterable<Future<Integer>> listOfFutureInts = source;

// now we have a Future[Iterable[Integer]]
Future<Iterable<Integer>> futureListOfInts = sequence(listOfFutureInts, ec);

// Find the sum of the odd numbers
Future<Long> futureSum = futureListOfInts.map(
     new Mapper<Iterable<Integer>, Long>() {
          public Long apply(Iterable<Integer> ints) {
              long sum = 0;
              for (Integer i : ints)
                   sum += i;
              return sum;
         }
     }, ec);

futureSum.onSuccess(new PrintResult<Long>(), system.dispatcher());

请记住,我正在使用Java版本的Akka进行开发,因为我对Scala不够熟悉 . 当你想要组成成功的期货时,这种方法很好 . 在这里,您只是汇总所有期货(整数)的结果并将它们相加并将其结果放在另一个可以在以后处理的未来 . 现在如果其中一个未来可能失败,即抛出异常会发生什么 . 当然,你可以使用'onFailure'回调来处理任何特定未来的失败,但我没有找到一种方法来处理组成期货时的失败 .

最好的方法是什么?我应该完全应用另一个概念吗?

谢谢 .

1 回答

  • 1

    您正在寻找 recoverrecoverWith ,如下所述:http://doc.akka.io/docs/akka/2.3.2/java/futures.html#Exceptions

    final ExecutionContext ec = system.dispatcher();
    
    Future<Integer> future = future(new Callable<Integer>() {
      public Integer call() {
        return 1 / 0;
      }
    }, ec).recover(new Recover<Integer>() {
      public Integer recover(Throwable problem) throws Throwable {
        if (problem instanceof ArithmeticException)
          return 0;
        else
          throw problem;
      }
    }, ec);
    
    future.onSuccess(new PrintResult<Integer>(), system.dispatcher());
    

相关问题