3

我正在使用 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 和正常产品列表中的结果?没有反应式控制器是否有可能?

PS我不想在调用 1 获得的结果上调用 .block() 和 CompleteableFuture

4

1 回答 1

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,那么此调用将阻塞线程池。

在这种情况下,请查看: 在 Spring Webflux 中执行阻塞 JDBC 调用

于 2020-06-21T14:40:15.720 回答