在Spring WebClient的每个请求的基础上配置超时?

cyej8jka  于 11个月前  发布在  Spring
关注(0)|答案(2)|浏览(121)

我知道Spring 5 webflux how to set a timeout on Webclient,但它为所有请求全局配置超时。我正在寻找一种方法来配置每个请求的超时。即类似于这样的东西(伪代码不起作用):

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();

rjee0c15

rjee0c151#

这两个答案清楚地说明了这一点。
设置超时- Spring -webflux-webclient
spring-5-webflux-how-to-set-a-timeout-on-webclient的一个。
此外,如果您希望更改选项,
你可以像下面这样做,

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()

字符串

vi4fp9gy

vi4fp9gy2#

我认为你可以使用这样的东西来设置它在每个请求的基础上。

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

字符串

相关问题