Spring WebFlux WebClient挂起,Mono.timeout无法捕获它

时间:2018-08-24 20:44:32

标签: spring-boot spring-webflux

我有相当简单的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,为什么它不覆盖呢?

2 个答案:

答案 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 **具有副作用仅用于日志使用。