我有一种方法可以遍历购物车中的商品,并使用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;
});
答案 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