我将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
答案 0 :(得分:2)
如果要从该方法返回.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()
使用的是JDBC,则此调用将阻塞线程池。
在这种情况下,请看以下内容: Execute blocking JDBC call in Spring Webflux