Spring Webflux - как получить значение из Flux без операций block () - PullRequest
0 голосов
/ 09 ноября 2019

Интересно, как написать неблокирующий код с 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 возвращает Flux

  2. Продукт имеет поле: ArrayList<ProductAvailability> availabilityCalendar

Это хороший подход?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 13 ноября 2019

как этот, я проверяю тэг действительный

 Flux.fromIterable(vo.getTags())
        .flatMap((tag) -> tagService.findByCode(tag.getCode()).map(TagBo::createByVo)).filter(Objects::nonNull).collectList().doOnNext(l->vo.setTags(l));
0 голосов
/ 11 ноября 2019

с помощью параметра onNext

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