使用响应式并行处理List <Mono <Object >>

时间:2019-06-12 21:24:20

标签: list parallel-processing mono flux reactive

我有一种方法可以遍历购物车中的商品,并使用placeOrder为其下订单。 对购物车中的所有商品都调用placeOrder之后,我要合并并发送一个Mono对象,以汇总经历了什么订单和没有订单的

此代码有效,但未使用placeOrder的并行执行。

List<Mono<OrderResponse>> orderResponse = new ArrayList<Mono<OrderResponse>>();
        OrderCombinedResponse combinedResponse = new OrderCombinedResponse();
//placeIndividualOrder returns Mono<OrderResponse>
        session.getCartItems().forEach(cartItem ->
          orderResponse.add(placeIndividualOrder(cartItem)));

return Flux.concat(orderResponse).collectList().map(responseList -> {
            responseList.forEach(response -> {
//Do transformation to separate out failed and successful order

            });
//Return Mono<OrderCombinedResponse> object
            return combinedResponse;
        });

我正在尝试使用下面的代码来并行处理购物车中的订单,但它不返回任何响应,只是退出

//Return Mono<OrderCombinedResponse> object 
return Flux.fromIterable(session.getCartItems()).parallel()
//Call method to place order. This method return Mono<OrderResponse>
.map(cartItem -> placeIndividualOrder(cartItem))
.runOn(Schedulers.elastic())
//
.map(r -> {
                    r.subscribe(response -> {
                        //Do transformation to separate out failed and successful order

                    });
                    return combinedResponse;
                });

1 个答案:

答案 0 :(得分:0)

由于方法placeIndivisualOrder()返回Mono,因此您需要使用.flatMap()进行调用。 .runOn()应该超出对placeIndivisualOrder()的调用。如果执行此操作,如上面的代码中所示,则仅使后续的.map()在调度程序上运行。最后,您不必像在subscribe()内一样在.map()内调用.subscribe(),而应该在.flatMap()之后调用return Flux.fromIterable(session.getCartItems()).parallel() .runOn(Schedulers.elastic()) //Call method to place order. This method return Mono<OrderResponse> .flatMap(cartItem -> placeIndividualOrder(cartItem)) .sibscribe(response -> { // do something with response }, e -> { // catch and report error })

_app.js