Spring web Flux WebClient:对等连接休息,#block因错误而终止。在以下站点观察到错误

Posted

技术标签:

【中文标题】Spring web Flux WebClient:对等连接休息,#block因错误而终止。在以下站点观察到错误【英文标题】:Spring web flux WebClient : Connection rest by peers,#block terminated with an error.Error has been observed at the following site 【发布时间】:2021-02-03 23:39:57 【问题描述】:

我正在使用 Spring Web Flux、Web 客户端来调用 Rest api。我收到以下错误。

Oct 21 09:46:27 ql-hybrid-stg web.7d755d6967-5d7v8  Suppressed: java.lang.Exception: #block terminated with an error 
Oct 21 09:46:27 ql-hybrid-stg web.7d755d6967-5d7v8      at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:99) ~[reactor-core-3.3.2.RELEASE.jar!/:3.3.2.RELEASE] 
Oct 21 09:46:27 ql-hybrid-stg web.7d755d6967-5d7v8      ... 97 common frames omitted 
Oct 21 09:46:27 ql-hybrid-stg web.7d755d6967-5d7v8 Caused by: io.netty.channel.unix.Errors$NativeIoException: readAddress(..) failed: Connection reset by peer 
Oct 21 09:46:27 ql-hybrid-stg web.7d755d6967-5d7v8  Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:  
Oct 21 09:46:27 ql-hybrid-stg web.7d755d6967-5d7v8 Error has been observed at the following site(s): 
Oct 21 09:46:27 ql-hybrid-stg web.7d755d6967-5d7v8  |_ checkpoint ? Request to GET https://cc-qa.app/api/matches/list/?status=current&page=0&size=100 [DefaultWebClient] 

是我的 Web 客户端调用或我正在调用的 api 的问题吗? 我很困惑,因为它显示了许多错误,例如 Connection rest by peers,#block 因错误而终止。在以下站点观察到错误。 如何解决这个问题? 请在下面找到代码

  @Bean
  public WebClient restClient() 

    String baseurl = env.getProperty("base-url");
    int memoryLimit = Integer.parseInt(env.getProperty("webclient-buffer-size"));

    ExchangeStrategies exchangeStrategies =
        ExchangeStrategies.builder()
            .codecs(
                configurer -> configurer.defaultCodecs().maxInMemorySize(1024 * 1024 * memoryLimit))
            .build();
    return WebClient.builder()
        .exchangeStrategies(exchangeStrategies)
        .baseUrl(baseurl)
        .build();
  

这是 api 调用:

webClient
              .get()
              .uri("/api/matches/list/?status=current&page=0&size=100")
              .header("authorization", accessToken)
              .retrieve()
              .bodyToMono(InfoPayload.class)
              .block();

请帮我找出问题。提前致谢

【问题讨论】:

【参考方案1】:

添加客户端Connector后问题解决。

 private ClientHttpConnector connector() 
    return new 
 ReactorClientHttpConnector(HttpClient.create(ConnectionProvider.newConnection()));
  

WebClient.builder()
        .clientConnector(connector())
        .exchangeStrategies(exchangeStrategies)
        .baseUrl(baseurl)
        .build();

【讨论】:

客户端连接器是做什么的? ClientConnector 提供了一个低级 API,可用于将 SocketChannel 连接到监听服务器。 如果您遇到块终止错误。您应该在进行 api 调用时创建一个新连接。这将解决问题。上面的代码是针对 WebClient 的。其余模板和其他模板可能略有不同。

以上是关于Spring web Flux WebClient:对等连接休息,#block因错误而终止。在以下站点观察到错误的主要内容,如果未能解决你的问题,请参考以下文章

Webclient 与简单 Flux.just 的 Flux 行为不同

webclient对reactor-netty的封装

如何并行进行多个 Spring Webclient 调用并等待结果?

使用 Spring WebClient 发出多个请求

Spring Boot响应式WebClient调用遗留端点

WebClient 停止从 Flux 读取时的异常