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

时间:2020-06-19 02:04:15

标签: spring-boot spring-webflux project-reactor nonblocking spring-reactive

我将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和常规产品列表中的结果? 如果没有反应式控制器,是否可以?

P.S。我不想在从电话1获得的结果上调用.block()和CompleteableFuture

1 个答案:

答案 0 :(得分:2)

如果要从该方法返回.block(),没有List<Products>的方法是无法实现的。

您应该合并结果,并从此方法返回Flux<Products>以保留被动方法。您可以使用mergeWithconcatWith

示例:

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

重要!

请记住,如果您的repositoryObj.getProductsNormal()使用的是JDBC,则此调用将阻塞线程池。

在这种情况下,请看以下内容: Execute blocking JDBC call in Spring Webflux