通过单线程的单声道

时间:2018-02-05 11:27:59

标签: java mono flux project-reactor reactor

我有来自db的Flux<Foo>(例如5个元素)。 我需要从每个Foo获取一些信息,将其全部设置为Mono<MyRequest>,发送到另一个休息资源,获取Mono<MyResponse>并使用每个Foo中的所有信息。

我在Flux.flatMap()中使用了很多Mono.zipWith()Mono.zipWhen(),但创建了MyRequest,并且发送到资源的次数是5次线程发生了5次。

Flux<Foo> flux = dao.getAll();
Flux<Foo> fluxAfterProcessing = flux.flatMap(foo -> monoFilters.map(...));
Mono<Tuple2<MyRequest, MyResponse>> mono = 
                      monoFilters.flatMap(filter -> monoRequest.map(...))
                                 .zipWhen(request -> api.send(request))
                                 .flatMap(tuple -> monoResponseFilters.map(...));
return fluxAfterProcessing.flatMap(foo -> 
                       monoResponseFilters.zipWith(mono).map(...))

如何通过Flux中的1个线程仅处理我的单声道功能一次?

1 个答案:

答案 0 :(得分:1)

让我们假设这个任务的内容是这样的:

  • 从数据库中获取一些值
  • 当所有值到达时,将它们包装在请求中并发送出去
  • 带回复的Zip结果

然后这导致我们这样的事情:

Flux<Foo> foos = dao.getAll();
Mono<List<Foo>> everything = foos.collectList();

Mono<MyRequest> request = everything
    // collect the data into another Mono, then into request
    .map(list -> list.stream().map(Foo::getData).collect(toList()))
    .map(data -> new MyRequest(data));

return request.zipWhen(request -> api.send(request));

或者,如果您映射初始foos

,则可以更轻松地收集构建请求
Flux<Data> data = dao.getAll().map(Foo::getData);
Mono<MyRequest> request = data.collectList().map(MyRequest::new);