spring-cloud-netflix - 在 Spring 5 WebClient 上设置请求特定读取超时的正确方法
问题描述
语境
我正在尝试找到结合 Spring 5WebClient
和Hystrix
. 使用 Hystrix,我为WebClient
.
当Hystrix
达到超时时,我还想确保WebClient
关闭它的连接。以前使用 时AsyncHttpClient
,这是通过requestTimeout
在执行特定调用之前设置 a 来完成的。但是,设置请求超时WebClient
要复杂得多,需要ClientHttpConnector
根据这个答案来完成。
Brian Cozel 提到ClientHttpConnector
在整个应用程序中共享相同的内容是最佳的。但是,由于需要在 上设置请求特定的超时ClientHttpConnector
,这似乎是不可能的。
问题
在 Spring 的 ReactiveWebClient
中,是否有适当的方法来设置特定于请求的超时,但仍使用单个ClientHttpConnector
?
解决方案
您可以在客户端连接器上配置的超时操作非常低级:它们与套接字/连接超时有关。此配置无法在请求级别完成,因为连接可能在连接池中共享和重用。
这个问题是关于响应超时的,因为您似乎关心每个请求获得响应的时间量。
在这种情况下,您可以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)
提供后备的变体。
推荐阅读
- python - 在不使用 ORM 的情况下登录用户的问题 - “无法在行中找到列‘is_active’的列”
- google-analytics - gtag.js 为所有目标的转化价值记录 0 美元,并且缺少增强型商务数据
- ios - 在 SwiftUI 中创建包含 1000 个元素的列表时的性能问题
- php - 如何使用 cURL 修复表单并从 api 获取响应
- javascript - 来自谷歌地图 api url fetch 的空 json
- python - 如何将一列中的字典分成两个单独的列,其中一个是键列表,另一个是python中的值列表
- javascript - 将 JavaScript 类混合与 TypeScript 声明文件一起使用
- python - 使用 seaborn 绘制熊猫的 groupby 对象
- python - 结合两个机器学习模型的结果
- spring-boot - 执行器指标标签 PathVariable 和通配符