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&lt;Item&gt; 而 Order 构造函数需要 List&lt;Item&gt;

【问题讨论】:

【参考方案1】:

您可以使用collectList() 方法,该方法会将您的Flux&lt;Item&gt; 更改为Mono&lt;List&lt;Item&gt;&gt;

之后,您可以使用map() 方法将您的List&lt;Item&gt; 转换为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

webFlux 学习

在 Spring Webflux 中结合非阻塞和阻塞调用并返回结果

Spring Reactive Programming with Webflux - 多个操作作为非阻塞流

Spring WebFlux 入门