同时处理项目反应堆的通量

时间:2016-03-21 09:18:20

标签: java project-reactor

我很擅长投射反应堆或反应式编程,所以我可能做错了。我正在努力构建一个执行以下操作的流程:

给定一个类实体:

Entity {
    private Map<String, String> items;
    public Map<String, String> getItems() {
        return items;
    }
}
  1. 从DB(ListenableFuture<Entity> readEntity()
  2. 读取实体
  3. 对每个项目(boolean processItem(Map.Entry<String, String> item)
  4. 执行一些并行异步处理
  5. 当所有完成的调用doneProcessing(void doneProcessing(boolean b)
  6. 目前我的代码是:

    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调用不会同时在所有项目上运行。我尝试将dispatchOnpublishOnioasync SchedulerGroup以及各种参数一起使用,但仍然会在一个线程上串行运行调用。 我做错了什么?

    除此之外,我相信一般情况下上述内容都可以改进,所以任何建议都会受到赞赏。

    由于

1 个答案:

答案 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);