Spring 启动 WebClient 连接和读取超时

Spring Boot WebClient Connection and Read Timeout

目前我的 post 和 get 请求是通过 WebClients 处理的,它有一个共同的连接和 Spring Boot 中的读取超时。我有 5 个不同的 classes,每个都需要自己的一组连接和读取超时。我不想创建 5 个不同的 WebClient,而是使用相同的 Webclient,但在发送 post 或来自特定 class 的获取请求时,指定所需的连接和读取超时。有什么办法可以实现吗?

我当前的网络客户端:

    @Bean
    public WebClient getWebClient(WebClient.Builder builder){

        HttpClient httpClient = HttpClient.newConnection()
                .tcpConfiguration(tcpClient -> {
                    tcpClient = tcpClient.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, connectionTimeout*1000);
                    tcpClient = tcpClient.doOnConnected(conn -> conn
                            .addHandlerLast(new ReadTimeoutHandler(readTimeout, TimeUnit.SECONDS)));
                    return tcpClient;
                }).wiretap(true);

        ClientHttpConnector connector = new ReactorClientHttpConnector(httpClient);

        return builder.clientConnector(connector).build();
    }

我正在使用的 post 请求:

public WebClientResponse httpPost(String endpoint, String requestData, Map<String, Object> requestHeader) {

        ClientResponse res = webClient.post().uri(endpoint)
                .body(BodyInserters.fromObject(requestData))
                .headers(x -> {
                    if(requestHeader != null && !requestHeader.isEmpty()) {
                        for (String s : requestHeader.keySet()) {
                            x.set(s, String.valueOf(requestHeader.get(s)));
                        }
                    }
                })
                .exchange()
                .doOnSuccess(x -> log.info("response code = " + x.statusCode()))
                .block();

        return convertWebClientResponse(res);
    }

您可以在 WebClient 中配置请求级超时。

 webClient.get()
   .uri("https://baeldung.com/path")
   .httpRequest(httpRequest -> {
   HttpClientRequest reactorRequest = httpRequest.getNativeRequest();
   reactorRequest.responseTimeout(Duration.ofSeconds(2));
 });

现在您可以根据请求从属性文件中添加这些值,也可以对它们进行硬编码。

参考:- https://www.baeldung.com/spring-webflux-timeout

您可以尝试 timeoutwebClient,如下所示,

webClient.post()
   .uri(..)
   .body(..)
   .retrieve()
   .
   .
   .
   .timeout(Duration.ofMillis(30);

30 只是一个例子。