在 Spring 5 WebClient 上设置请求特定读取超时的正确方法

Proper way to setup request specific read timeout on Spring 5 WebClient

上下文

我正在尝试找到组合 Spring 5 WebClientHystrix 的最佳方法。使用 Hystrix,我为 WebClient.

完成的不同类型的请求设置了不同的超时时间

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

ClientHttpConnector 上完成

最好在整个应用程序中共享相同的 ClientHttpConnector。但是,因为需要在 ClientHttpConnector 上设置请求特定超时,这似乎不可能。

问题

在 Spring 的 Reactive WebClient 中,是否有设置请求特定超时的正确方法,但仍然使用单个 ClientHttpConnector

您可以在客户端连接器上配置的超时操作级别很低:它们大约 socket/connection 超时。此配置无法在请求级别完成,因为连接可能会在连接池中共享和重用。

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

在这种情况下,您可以根据每个请求使用 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) 变体。