Kotlin 协程 MDC 上下文未恢复

Kotlin corutines MDCContext isn't restored

只是玩弄协程和记录 MDC。 我有一个虚拟示例

@GetMapping("/dummy/{delay}")
suspend fun dummyEndpoint(@PathVariable delay: Int): ResponseEntity<String> {
    logger.debug("Outside the context. Start")
    withContext(MDCContext(mapOf("myKey" to "myVal"))) {
        logger.debug("Inside the context. Before the call")
        val response = WebClient.create()
            .get()
            .uri("http://postman-echo.com/delay/${delay}")
            .retrieve()
            .awaitBody<String>()
        logger.debug("Inside the context. After the call")
    }
    logger.debug("Outside the context. End")
    return ResponseEntity.ok("OK")
}

它产生下一条日志消息:

2020-07-30 19:42:09,817 - [DEBUG] - [reactor-http-nio-3] - [{}] 
Outside the context. Start

2020-07-30 19:42:09,836 - [DEBUG] - [reactor-http-nio-3] - [{myKey=myVal}]
Inside the context. Before the call

2020-07-30 19:42:15,411 - [DEBUG] - [reactor-http-nio-4] - [{myKey=myVal}] 
Inside the context. After the call

2020-07-30 19:42:15,412 - [DEBUG] - [reactor-http-nio-4] - [{myKey=myVal}] 
Outside the context. End

我的期望是在 withContext() 块完成后清除上下文。

灵感来自 https://medium.com/@elizarov/phantom-of-the-coroutine-afc63b03a131

这比较冗长,但也避免了在调用 doSomeWork 后需要恢复上下文。

那么为什么上下文之外的最后一条消息仍然包含 MDC 值?或者我遗漏了什么?

如评论之一所述,该问题已在 https://github.com/Kotlin/kotlinx.coroutines/issues/985

中讨论

它似乎已在最新版本之一中修复。