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

时间:2018-06-05 13:38:19

标签: spring-cloud-netflix spring-webflux hystrix reactor-netty

上下文

我正在尝试找到结合Spring 5 WebClientHystrix的最佳方法。使用Hystrix,我为WebClient完成的不同类型的请求设置了不同的超时。

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

Brian Cozel mentions在整个应用程序中共享相同的ClientHttpConnector是最佳选择。但是,因为需要在ClientHttpConnector上设置特定于请求的超时,所以这似乎不可能。

问题

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

1 个答案:

答案 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)变体。