我正在尝试找到结合Spring 5 WebClient
和Hystrix
的最佳方法。使用Hystrix,我为WebClient
完成的不同类型的请求设置了不同的超时。
当Hystrix
达到超时时,我还要确保WebClient
关闭其连接。以前使用AsyncHttpClient
时,这是通过在执行特定呼叫之前设置requestTimeout
来完成的。但是,在WebClient
上设置请求超时要复杂得多,需要根据this answer在ClientHttpConnector
上完成。
Brian Cozel mentions在整个应用程序中共享相同的ClientHttpConnector
是最佳选择。但是,因为需要在ClientHttpConnector
上设置特定于请求的超时,所以这似乎不可能。
在Spring的Reactive WebClient
中,是否有正确的方法来设置请求特定的超时,但仍使用单个ClientHttpConnector
?
答案 0 :(得分:3)
您可以在客户端连接器上配置的超时操作非常低级别:它们与套接字/连接超时有关。此配置无法在请求级别完成,因为连接可能在连接池中共享和重用。
这个问题是关于响应超时,因为您似乎关心每个请求获得响应的时间。
在这种情况下,您可以按请求使用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)
变体。