【发布时间】:2021-04-27 10:23:37
【问题描述】:
我正在使用带有微服务框架的 akka,所以我收到了很多完成阶段请求。我想从一个微服务中获取元素列表,并将它们与另一个微服务中的单个元素一起压缩,这样我最终得到一个 Source of Pair。
我无法使用普通 zip 执行此操作,因为 Source.zip 会在两个源之一完成后立即完成,因此我最终只会传播一个元素。
我不能使用 Source.zipAll,因为这需要我提前定义默认元素。
如果我提前拥有单个元素,我可以使用 Source.repeat 使其重复传播该元素,这意味着 Source.zip 将在元素列表完成时完成,但 Source.repeat 可以t 采取完成阶段或 Source.completionStage。
我目前的策略是在 mapConcat 列表元素之前将所有内容压缩在一起。
Source<singleElement> singleElement = Source.completionStage(oneService.getSingleElement().invoke());
return Source.completionStage(anotherService.getListOfElements().invoke)
.zip(singleElement)
.flatMapConcat(pair -> Source.fromIterator(() -> pair.first().stream().map(listElement -> Pair.create(listElement, pair.second())));
这最终得到了我想要的,但我觉得有很多不必要的重复和同步移动数据。有没有更好的方法来解决我错过的这个问题?
【问题讨论】:
标签: java akka akka-stream lagom completion-stage