首页 > 解决方案 > 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()

标签: spring-bootspring-webflux

解决方案


在这种情况下,httpbin.org 不返回响应正文,因此该bodyToMono方法将返回等效的Mono.empty().

如果您将map { println("Response $it") }(永远不会运行,因为我们没有得到正文)更改为 a doOnSuccess { log.info("Response received") }"Response received"则会打印消息。

这意味着它Mono没有被卡住,它只是以一个空的身体完成。


推荐阅读