Spring Boot WebClient 连接和读取超时

Adi*_*a K 5 java spring-boot spring-webclient

目前,我的 post 和 get 请求是通过 WebClients 处理的,WebClients 在 Spring Boot 中具有公共连接和读取超时。我有 5 个不同的类,每个类都需要自己的一组连接和读取超时。我不想创建 5 个不同的 WebClient,而是使用相同的 Webclient,但在从特定类发送 post 或 get 请求时,指定所需的连接和读取超时。有没有办法实现这个?

我当前的网络客户端:

    @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();
    }
Run Code Online (Sandbox Code Playgroud)

我正在使用的帖子请求:

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);
    }
Run Code Online (Sandbox Code Playgroud)

Man*_*oni 5

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

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

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

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