在 Spring 5 WebClient 上设置请求特定读取超时的正确方法
Proper way to setup request specific read timeout on Spring 5 WebClient
上下文
我正在尝试找到组合 Spring 5 WebClient
和 Hystrix
的最佳方法。使用 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)
变体。
上下文
我正在尝试找到组合 Spring 5 WebClient
和 Hystrix
的最佳方法。使用 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)
变体。