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
中讨论
它似乎已在最新版本之一中修复。
只是玩弄协程和记录 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
中讨论它似乎已在最新版本之一中修复。