首页 > 解决方案 > 在 Spring 5 WebClient 上设置请求特定读取超时的正确方法

问题描述

语境

我正在尝试找到结合 Spring 5WebClientHystrix. 使用 Hystrix,我为WebClient.

Hystrix达到超时时,我还想确保WebClient关闭它的连接。以前使用 时AsyncHttpClient,这是通过requestTimeout在执行特定调用之前设置 a 来完成的。但是,设置请求超时WebClient要复杂得多,需要ClientHttpConnector根据这个答案来完成。

Brian Cozel 提到ClientHttpConnector在整个应用程序中共享相同的内容是最佳的。但是,由于需要在 上设置请求特定的超时ClientHttpConnector,这似乎是不可能的。

问题

在 Spring 的 ReactiveWebClient中,是否有适当的方法来设置特定于请求的超时,但仍使用单个ClientHttpConnector

标签: spring-cloud-netflixspring-webfluxhystrixreactor-netty

解决方案


您可以在客户端连接器上配置的超时操作非常低级:它们与套接字/连接超时有关。此配置无法在请求级别完成,因为连接可能在连接池中共享和重用。

这个问题是关于响应超时的,因为您似乎关心每个请求获得响应的时间量。

在这种情况下,您可以timeout根据每个请求使用运算符:

Mono<UserData> result = this.webClient.get()
                .uri("/user")
                .accept(MediaType.APPLICATION_JSON)
                .retrieve()
                .bodyToMono(UserData.class)
                .timeout(Duration.ofSeconds(10));

超时运算符将在管道中抛出一个TimeoutException;您可以使用其中一个onError*运算符来定义在这些情况下应该做什么。或者,您可以直接使用timeout(Duration, Mono)提供后备的变体。


推荐阅读