【问题标题】:Akka compose futures of different typesAkka 组合不同类型的期货
【发布时间】:2018-06-11 01:47:38
【问题描述】:

我有 3 个不同类型的 scala.concurrent.Future,需要将它们组合在 akka.dispatch.Futures.sequence 中,以便在所有期货完成时收到通知,期货声明为:

Future<List<Request>> f1
Future<List<Offer>> f2
Future<Event> f3

我试图将它们放在声明为Iterable&lt;Future&lt;Object&gt;&gt; futureIterable = new ArrayList&lt;&gt;();Iterable&lt;Future&lt;Object&gt;&gt;

如下:

    Iterable<Future<Object>> futureIterable = new ArrayList<>();
    Future<Iterable<Future<Object>>> futureListOfInts=sequence(futureIterable,getContext().dispatcher());

我收到了这条编译消息:

Error:(139, 67) java: incompatible types: inferred type does not conform to equality constraint(s)
inferred: scala.concurrent.Future<java.lang.Object>
equality constraints(s): scala.concurrent.Future<java.lang.Object>,java.lang.Object

【问题讨论】:

    标签: akka future


    【解决方案1】:

    Futures.sequence 在将Future[Iterable[A]] 中的Iterable[Future[A]] 转换为具有相同对象A 时效果很好。

    要“等待”不同Futures 的完成,更通用和惯用的方式是flatMap 它们,如以下sn-p:

    final ExecutionContext ec = getContext().dispatcher();
    
    public Future<Result> composeFutures(Future<List<Request>> f1, Future<List<Offer>> f2, Future<Event> f3) {
    
        return f1.flatMap(new Mapper<List<Request>, Future<Result>>() {
            @Override
            public Future<Result> apply(List<Request> requestList) {
                return f2.flatMap(new Mapper<List<Offer>, Future<Result>>() {
                    @Override
                    public Future<Result> apply(List<Offer> offers) {
                        return f3.map(new Mapper<Event, Result>() {
                            @Override
                            public Result apply(Event event) {
    
                                // use requestList, offers, event
                                // to have your result
                                // ...
    
                                return new Result();
                            }
                        }, ec);
                    }
                }, ec);
            }
        }, ec);
    
    }
    

    如您所见,composeFutures 方法将返回单个Future,当f1f2f3 成功完成时,该方法将完成。如果其中一个失败,则将返回失败的未来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2016-09-06
      • 2013-04-12
      • 1970-01-01
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多