为 Spring WebClient 配置每个请求的超时?

问题描述 投票:0回答:2

我知道 Spring 5 webflux 如何在 Webclient 上设置超时,但这会为所有请求全局配置超时。我正在寻找一种根据每个请求配置超时的方法。 IE。像这样的东西(不起作用的伪代码):

WebClient client = ...

// Call 1
client.timeout(5, TimeUnit.SECONDS).contentType(APPLICATION_JSON).syncBody(..).exchange(). ..

// Call 2
client.timeout(4, TimeUnit.SECONDS).contentType(APPLICATION_JSON).syncBody(..).exchange(). 

timeout
函数是为了演示我所追求的而编写的。我怎样才能实现这个目标?在超时时正确清理资源也很重要。

如果有什么区别,我正在使用 Netty (

reactor-netty
0.8.4.RELEASE):

HttpClient httpClient = HttpClient.create(). ...;

 WebClient webClient = WebClient.builder()
          .clientConnector(new ReactorClientHttpConnector(httpClient))
          .build();
spring spring-boot spring-webflux project-reactor
2个回答
2
投票

这两个答案已经很清楚地解释了。

在 spring-webflux-webclient 中设置超时
spring-5-webflux-如何在 Web 客户端上设置超时

此外,如果您想改变选项,

你可以像下面这样做,

 TcpClient tcpClient = TcpClient.create()
                .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 1000)
                .doOnConnected(connection ->
                        connection.addHandlerLast(new ReadTimeoutHandler(10))
                                .addHandlerLast(new WriteTimeoutHandler(10)));
        return this.webClient
                .mutate()
                .clientConnector(new ReactorClientHttpConnector(HttpClient.from(tcpClient)))
                .build()
                .get()


0
投票

我认为你可以使用这样的东西来根据每个请求进行设置。

webClient.get()
  .uri("/path")
  .httpRequest(httpRequest -> {
    HttpClientRequest reactorRequest = httpRequest.getNativeRequest();
    reactorRequest.responseTimeout(Duration.ofSeconds(2));
  });
© www.soinside.com 2019 - 2024. All rights reserved.