我有来自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个线程仅处理我的单声道功能一次?
答案 0 :(得分:1)
让我们假设这个任务的内容是这样的:
然后这导致我们这样的事情:
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);