spring-boot - Spring WebFlux WebClient 挂起并且 Mono.timeout 没有捕捉到它
问题描述
我有相当简单的 Kotlin 代码,它总是阻塞并且从不返回:
WebClient
.create()
.get()
.uri("https://httpbin.org/status/200")
.exchange()
.flatMap {
println("Status ${it.statusCode()}")
it.bodyToMono(String::class.java)
}
.timeout(Duration.ofSeconds(5), Mono.just("fallback"))
.map { println("Response $it") } // never runs
.block()
httpbin
在这种情况下,不返回任何内容(仅返回标题),那么是否bodyToMono
会在这里永远等待内容?是否有可靠的方法来处理这种情况(阅读 Content-Length 不可靠)我将 Mono.timeout 设置为后备值,为什么它不涵盖呢?
解决方案
在这种情况下,httpbin.org 不返回响应正文,因此该bodyToMono
方法将返回等效的Mono.empty()
.
如果您将map { println("Response $it") }
(永远不会运行,因为我们没有得到正文)更改为 a doOnSuccess { log.info("Response received") }
,"Response received"
则会打印消息。
这意味着它Mono
没有被卡住,它只是以一个空的身体完成。
推荐阅读
- django - 不能再在 Django 中删除数据库并重新应用迁移?
- php - “php lint”用于特定且稍早版本的 PHP?
- python - dataframe.plot.bar() 似乎没有将周期索引正确地处理为“x”
- git - Git AdvertisementPushOptions 配置已启用,但推送选项不起作用。我错过了什么吗?
- asp.net-core - 使用 OKTA OpenIdConnect 进行基于策略的身份验证
- c - 无法释放分配的内存
- c# - Rider 上的 ASP.NET Core 3.1 中的 MacOS 开发:Windows 身份验证
- python - 按钮下的 PyGame 文本
- clojure - 从 clojure.org 站点仅下载 clojure.jar 后是否可以使用 REPL clojure?
- javascript - 如何在我的应用 Angular 9 中限制 API 请求