【问题标题】:Spring Webflux - how to get value from Flux without block() operationsSpring Webflux - 如何在不使用 block() 操作的情况下从 Flux 中获取价值
【发布时间】:2020-03-05 13:47:11
【问题描述】:

我想知道如何使用 Webflux 编写非阻塞代码。

这是我想做的:

  1. 通过ProductProperties 字段获取所有产品(以 Flux 形式返回)
  2. Flux<Product>.availabilityCalendar获取值列表 使用在第 2 步中检索到的数据并获取一些其他数据(以 Flux 形式返回) - 一切都应该是非阻塞操作。

如何做到这一点?如何从Flux<Object> 获取值,然后获取以 Flux 形式返回的其他一些数据,从而避免像 Flux.block() 这样的阻塞操作来检索下一步获取最终数据返回所需的数据?

    public Flux<Product> getAllProductsByAvailability(Flux<ProductProperties> productProperties,
                Map<String, String> searchParams) {

    productProperties
                    .flatMap(property -> productRepository.findByProductPropertiesId(property.getId())) //1. return Products
                    .flatMap(product -> Flux.just(product.getAvailabilityCalendar())) //2. how to get Product.availabilityCalendar list as non-blocking operation to work with this data afterwards?
(...)

地点:

  1. productRepository.findByProductPropertiesId 返回通量

  2. 产品具有字段:ArrayList&lt;ProductAvailability&gt; availabilityCalendar

这是一个好方法吗?

谢谢!

【问题讨论】:

    标签: reactive-programming spring-webflux


    【解决方案1】:

    通过使用 onNext 参数

    productRepository.findByProductPropertiesId(property.getId())
    .onNext(product -> {
        return // Do things here
    })
    

    【讨论】:

      【解决方案2】:

      像这样 我检查标签是否有效

       Flux.fromIterable(vo.getTags())
              .flatMap((tag) -> tagService.findByCode(tag.getCode()).map(TagBo::createByVo)).filter(Objects::nonNull).collectList().doOnNext(l->vo.setTags(l));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-09
        • 1970-01-01
        • 2013-03-25
        • 1970-01-01
        • 1970-01-01
        • 2020-04-30
        • 1970-01-01
        相关资源
        最近更新 更多