当前位置: 首页 > 知识库问答 >
问题:

WebClient 在使用 share() 后跟 block() 调用但调用 block() 时挂起,但调用 block() 仅返回错误

郁吉星
2023-03-14

我在Spring批处理应用程序中使用Spring WebFlux WebClient,当我调用block时,我遇到了错误。代码非常简单,但是当我尝试从批处理作业中的控制器上的 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方法包装在一个Service中,用于在Controller中检索ProductInfo。我使用share(),因为对Rest控制器的block()调用刚刚挂起。

但是,如果我简单地调用block()并首先调用share(),则对控制器的调用返回,但抛出以下错误。我对使用WebFlux非常陌生,所以我不知道发生了什么。我非常感谢您帮助我理解正在发生的事情以及解决这个问题的方法

java.lang.IllegalStateException:block()/blockFirst()/block last()正在阻塞,这在线程reactor-http-nio-2中不受支持

当我使用 share() 后跟 block() 时,当我调用 rest 终结点时,我的应用程序挂起。但是,如果我单独使用block(),则方法返回

共有1个答案

邢飞雨
2023-03-14

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

 类似资料:
  • 组件中传递的属性可以在块表达式中返回结果。 下表列出了使用块参数的不同方法 - S.No. BlockParam方式和描述 1 从具有yield的组件返回值 可以使用yield选项从组件返回值。 2 支持块和非块组件使用 您可以使用hasBlock属性支持单个组件使用块和非块组件。

  • 本文向大家介绍iOS中Block的回调使用和解析详解,包括了iOS中Block的回调使用和解析详解的使用技巧和注意事项,需要的朋友参考一下 Block 回调实现 先跟着我实现最简单的 Block 回调传参的使用,如果你能举一反三,基本上可以满足了 OC 中的开发需求。已经实现的同学可以跳到下一节。 首先解释一下我们例子要实现什么功能(其实是烂大街又最形象的例子): 有两个视图控制器 A 和 B,现

  • 我实现了一个try-catch块。 我试图用一种特定的方式实现捕捉块,但是它不太好用。如果输入不是整数,它应该重复并返回到try块。它只工作一次,但更多。 你能给我一些帮助吗?非常感谢。

  • 我正在尝试使用Webflux将生成的文件流式传输到另一个位置,但是,如果文件的生成遇到了错误,api将返回成功,但是在生成文件时有一个DTO详细说明了错误,而不是文件本身。这是在使用一个非常旧和设计差的api,所以请原谅使用post和api设计。 api调用(exchange())的响应是ClientResponse。在这里,我可以使用bodyToMono转换为ByteArrayResource,

  • 问题内容: 我正在尝试使用Webflux将生成的文件流式传输到另一个位置,但是,如果文件的生成遇到错误,则api返回成功,但是DTO在生成文件而不是文件本身时会详细说明错误。这使用的是非常古老且设计不佳的api,因此请原谅post和api设计的使用。 api调用(exchange())的响应是ClientResponse。从这里,我可以使用bodyToMono转换为ByteArrayResourc

  • 我试图获取值(字符串)使用Spring WebFlux WebClient,(使用SpringBoot版本2.4.5,) 但在误差以下 块方法参考-https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html#webflux-client-synchronous