我很擅长投射反应堆或反应式编程,所以我可能做错了。我正在努力构建一个执行以下操作的流程:
给定一个类实体:
Entity {
private Map<String, String> items;
public Map<String, String> getItems() {
return items;
}
}
ListenableFuture<Entity> readEntity()
)boolean processItem(Map.Entry<String, String> item)
)void doneProcessing(boolean b)
)目前我的代码是:
handler = this;
Mono
.fromFuture(readEntity())
.doOnError(t -> {
notifyError(“some err-msg” , t);
return;
})
.doOnSuccess(e -> log.info("Got the Entity: " + e))
.flatMap( e -> Flux.fromIterable(e.getItems().entrySet()))
.all(handler::processItem)
.consume(handler::doneProcessing);
事情有效,但handler::processItem
调用不会同时在所有项目上运行。我尝试将dispatchOn
和publishOn
与io
和async
SchedulerGroup
以及各种参数一起使用,但仍然会在一个线程上串行运行调用。
我做错了什么?
除此之外,我相信一般情况下上述内容都可以改进,所以任何建议都会受到赞赏。
由于
答案 0 :(得分:4)
您需要另一个为每个单独的地图元素分叉和加入计算的flatMap:
Mono.fromFuture(readEntity())
.flatMap(v -> Flux.fromIterable(v.getItems().entrySet()))
.flatMap(v -> Flux.just(v)
.publishOn(SchedulerGroup.io())
.doOnNext(handler::processItem))
.consume(handler::doneProcessing);