我有相当简单的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,为什么它不覆盖呢?
答案 0 :(得分:1)
在这种情况下,httpbin.org不返回响应正文,因此bodyToMono
方法将返回与Mono.empty()
等效的结果。
如果将map { println("Response $it") }
(由于没有身体,它将永远不会运行)更改为doOnSuccess { log.info("Response received") }
,则会显示"Response received"
消息。
这意味着Mono
未被卡住,只是以一个空的正文完成了。
答案 1 :(得分:0)
我有同样的问题。阅读Brain的答案后,我认为真正的问题仍然无法解决。实际上,我们需要采取行动以无身体的应对,例如用Mono.just答复(就像Artem想要在超时后执行)。现在timeout()
无法处理这种情况,但是doOnSuccess()
似乎也无法处理这种情况,因为它将被称为具有身体或没有身体。在doOnSuccess()
中,我们仍然不知道clientReponse是否具有主体,然后采取不同的操作。
正如Brian之前所说的那样,doOn **具有副作用仅用于日志使用。