Объединение неблокирующих и блокирующих вызовов и возвращение результатов в Spring Webflux - PullRequest
1 голос
/ 19 июня 2020

Я использую Spring Webflux вместе с Spring boot 2, и мой сценарий выглядит следующим образом:

Контроллер

@GetMapping(path="/products")
public List<Products> getProducts(){
 return serviceObj.getProducts();
}

Класс обслуживания

public List<Products> getProducts(){
List<Products> products = null;
  //Call 1 -> to repository class method returning Flux<Products>
repositoryObj.getProductsFlux();
  //Call 2 -> To repository class method returning List<Products>
repositoryObj.getProductsNormal();
  //Concat results from Call 1 & Call 2 and return List<Products>
return products;
}

Как я могу объединить результаты из списка продуктов Flux & normal перед возвратом? Возможно ли это без реактивного контроллера?

PS Я не хочу вызывать .block () и CompleteableFuture по результатам, полученным от Call 1

1 Ответ

2 голосов
/ 21 июня 2020

Невозможно сделать это без .block() способа, если вы хотите вернуть List<Products> из этого метода.

Лучше объединить результаты и вернуть Flux<Products> из этого метода, чтобы сохранить реактивный подход. Вы можете использовать mergeWith или concatWith

Пример:

public Flux<Products> getProducts(){
    List<Products> productsNonFlux = repositoryObj.getProductsNormal();
    Flux<Products> productsFlux = repositoryObj.getProductsFlux();
    return productsFlux.mergeWith(Flux.fromIterable(productsNonFlux));
}

ВАЖНО!

Имейте в виду, что если ваш repositoryObj.getProductsNormal() использует JDB C, то этот вызов заблокирует пул потоков.

В таком случае обратите внимание на: Выполнить блокирующий вызов JDB C в Spring Webflux

...