Akka撰写不同类型的期货

时间:2017-12-31 12:51:32

标签: akka future

我有3 scala.concurrent.Future种不同的类型,需要在akka.dispatch.Futures.sequence内组成它们,以便在所有期货完成时获得通知,期货被声明为:

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

我尝试将它们放在Iterable<Future<Object>>中,声明为Iterable<Future<Object>> futureIterable = new ArrayList<>();

如下:

    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

1 个答案:

答案 0 :(得分:0)

Futures.sequence可以很好地转换Iterable[Future[A]]Future[Iterable[A]]的{​​{1}}同一个tipe A的对象。

等待&#34;等待&#34;对于不同Future的完整性,更通用和惯用的方法是flatMap,如下面的代码段所示:

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成功完成后完成。如果其中一个失败,将返回失败的未来。