WebFlux 如何以功能性非阻塞方式链接查询
Posted
技术标签:
【中文标题】WebFlux 如何以功能性非阻塞方式链接查询【英文标题】:WebFlux How to Chain Queries In Functional Non Blocking Way 【发布时间】:2019-11-27 00:00:00 【问题描述】:我是函数范式的新手,想知道如何在创建新对象之前进行一些查询?
@Override
public Mono<Order> create(CreateOrderRequest specs)
//itemRepository.findAll(specs.getItemCodes()) //returns Flux<Item>
final Order newOrder = new Order(items);
return orderRepository.insert(newOrder)
.switchIfEmpty(Mono.error(new ResponseStatusException(HttpStatus.BAD_REQUEST, "Failed to create order")));
如何以非阻塞方式链接注释代码?查询返回 Flux<Item>
而 Order 构造函数需要 List<Item>
【问题讨论】:
【参考方案1】:您可以使用collectList()
方法,该方法会将您的Flux<Item>
更改为Mono<List<Item>>
。
之后,您可以使用map()
方法将您的List<Item>
转换为Order
对象,并使用flatMap()
方法获取保存的结果。
例如:
return itemRepository
.findAll(specs.getItemCodes())
.collectList()
.map(Order::new)
.flatMap(orderRepository::insert)
.switchIfEmpty(Mono.error(new ResponseStatusException(HttpStatus.BAD_REQUEST, "Failed to create order")));
【讨论】:
以上是关于WebFlux 如何以功能性非阻塞方式链接查询的主要内容,如果未能解决你的问题,请参考以下文章
如何以非阻塞方式链接期货?也就是说,如何在不阻塞的情况下将一个future用作另一个future的输入?
在 Spring Webflux 中结合非阻塞和阻塞调用并返回结果