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

cyej8jka  于 2024-01-05  发布在  Spring
关注(0)|答案(2)|浏览(173)

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

  1. WebClient client = ...
  2. // Call 1
  3. client.timeout(5, TimeUnit.SECONDS).contentType(APPLICATION_JSON).syncBody(..).exchange(). ..
  4. // Call 2
  5. client.timeout(4, TimeUnit.SECONDS).contentType(APPLICATION_JSON).syncBody(..).exchange().

字符串
timeout函数是为了演示我所追求的。我如何才能实现这一点?在超时时正确清理资源也很重要。
如果有区别的话,我使用Netty(reactor-netty 0.8.4.RELEASE):

  1. HttpClient httpClient = HttpClient.create(). ...;
  2. WebClient webClient = WebClient.builder()
  3. .clientConnector(new ReactorClientHttpConnector(httpClient))
  4. .build();

rjee0c15

rjee0c151#

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

  1. TcpClient tcpClient = TcpClient.create()
  2. .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 1000)
  3. .doOnConnected(connection ->
  4. connection.addHandlerLast(new ReadTimeoutHandler(10))
  5. .addHandlerLast(new WriteTimeoutHandler(10)));
  6. return this.webClient
  7. .mutate()
  8. .clientConnector(new ReactorClientHttpConnector(HttpClient.from(tcpClient)))
  9. .build()
  10. .get()

字符串

展开查看全部
vi4fp9gy

vi4fp9gy2#

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

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

字符串

相关问题