Spring Reactive Programming с Webflux - несколько операций в виде неблокирующего потока - PullRequest
0 голосов
/ 10 ноября 2019

У меня есть следующий код:

public Flux<Offer> getAllFilteredOffers(Map<String, String> searchParams) {

    Flux<ProductProperties> productProperties = productPropertiesService.findProductPropertiesBySearchCriteria(searchParams);
    Flux<Product> products = productService.findProductsByPropertyId(productProperties);
    Flux<Product> productsByAvailability = productService.getAllProductsByAvailability(products, searchParams);
    Flux<Offer> offers = offerRepository.findByPropertiesIds(productsByAvailability);
    return offers;

Этот метод:

productService.getAllProductsByAvailability(products, searchParams);

выглядит так:

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

Как передать List<Product> в getAllProductsByAvailability сохранить неблокирующие операции? Я читал, что карта блокируется и ее следует избегать. Может быть, что-то подобное?

    Flux
                    .just(productPropertiesService.findProductPropertiesBySearchCriteria(searchParams))
                    .flatMap(productProperties -> productService.findProductsByPropertyId(productProperties))
                    .flatMap(products -> productService.getAllProductsByAvailability(Flux.create(products)?????????, searchParams))
???

Я не эксперт в Webflux, в настоящее время я пытаюсь выяснить, как справиться с такими проблемами, как: у меня есть Flux, но на втором этапе мне нужно получить некоторые данныеиз предыдущего объекта Flex <> - поддержание неблокирующего потока.

Than you!

1 Ответ

1 голос
/ 11 ноября 2019

Я не знаю, где вы читали о map, но если вы посмотрите на официальную документацию Оператор карты Webflux , в блокировке ничего нет, она просто использует синхронную функцию для каждого элемента.

Используйте этот код:

productPropertiesService.findProductPropertiesBySearchCriteria(searchParams)
                .flatMap(productProperties -> productService.findProductsByPropertyId(productProperties))
                .collectList()   (1)
                .flatMapMany(products -> productService.getAllProductsByAvailability(Flux.fromIterable(products), searchParams)) (2)

1) собрать все элементы в List и преобразовать в Mono>

2) создать FLux из List и предоставить его в качестве параметра, преобразование flatMapManyMono to Flux

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...