结合非阻塞和阻塞调用并在 Spring Webflux 中返回结果
Combining non-blocking and blocking calls and returning the results in Spring Webflux
我正在使用 Spring Webflux 和 Spring boot 2,我的场景是这样的:
控制器
@GetMapping(path="/products")
public List<Products> getProducts(){
return serviceObj.getProducts();
}
服务Class
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 和普通产品列表的结果?
没有 Reactive Controller 是否可行?
P.S。我不想在调用 1
获得的结果上调用 .block() 和 CompleteableFuture
如果你想 return List<Products>
从那个方法,没有 .block()
方法就无法做到这一点。
您应该合并此方法的结果和 return Flux<Products>
以保持反应性方法。您可以使用 mergeWith
or concatWith
示例:
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 和 Spring boot 2,我的场景是这样的:
控制器
@GetMapping(path="/products")
public List<Products> getProducts(){
return serviceObj.getProducts();
}
服务Class
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 和普通产品列表的结果? 没有 Reactive Controller 是否可行?
P.S。我不想在调用 1
获得的结果上调用 .block() 和 CompleteableFuture如果你想 return List<Products>
从那个方法,没有 .block()
方法就无法做到这一点。
您应该合并此方法的结果和 return Flux<Products>
以保持反应性方法。您可以使用 mergeWith
or concatWith
示例:
public Flux<Products> getProducts(){
List<Products> productsNonFlux = repositoryObj.getProductsNormal();
Flux<Products> productsFlux = repositoryObj.getProductsFlux();
return productsFlux.mergeWith(Flux.fromIterable(productsNonFlux));
}
重要!
请记住,如果您的 repositoryObj.getProductsNormal()
正在使用 JDBC,那么此调用将阻塞线程池。
在这种情况下,请查看: