WebClient 在使用 share() 后跟 block() 调用时挂起但仅调用 block() returns 时出现错误

WebClient hanging when using share() followed by block() call but calling block() only returns with an error

我在 spring 批处理应用程序中使用 Spring WebFlux WebClient,但在调用 block 时出现错误。代码非常简单,但是当应用程序尝试从批处理作业中控制器上的 Rest 端点启动作业时出现错误。

rest端点是这样的:

@RequestMapping("/migration/products/catalog 
class ProductController{
    private final Job job; 
    ResponseEntity<Map<String,Object> loadProductCatalog(){
       // Code  to launch Product Catalog Job
    }
}

这是调用远程客户端获取产品目录信息的方法,控制器可以使用这些信息来加载有关产品的信息

 public ProductInfo findProductInfo()  {
    try{
        String url =....;
        return webClient.get().uri(url)
                .accept(MediaType.APPLICATION_JSON).retrieve().
                bodyToMono(ProductInfo.class).share().block();
    }catch(Exception e){
        log.error("Exception during retrieval of ProductInfo Data [}", e);
        return null;
    }

}

findProductInfo 方法包装在一个服务中,该服务用于在控制器中检索 ProductInfo。 我正在使用 share() 因为对 Rest 控制器的 block() 调用只是挂起。

但是,如果我简单地调用 block() 并首先调用 share() 对控制器的调用 returns 但会抛出以下错误。我对使用 WebFlux 很陌生,所以我不知道发生了什么。如果能帮我破译正在发生的事情以及解决这个问题,我将不胜感激

java.lang.IllegalStateException: block()/blockFirst()/blockLast() 是阻塞的,thread reactor-http-nio-2不支持

当我使用 share() 后接 block() 时,我的应用程序在调用其余端点时挂起。但是,如果我单独使用 block() 方法 returns

已解决:我的作业 运行 在单线程中运行,因此 share().block() 阻塞了作业启动器的主线程。我发现通过观察任务执行器是同步的,这给了我线索,它突然变得有意义了。我配置了一个任务执行器,这样作业就会 运行 在它自己的线程和中提琴中!