【发布时间】:2021-11-27 17:09:21
【问题描述】:
我们计划将自定义标头用于测试目的,这些标头应在我们的微服务中传递。我们的应用程序使用 Java/Kotlin 和 Spring Boot。
感谢 RequestContextHolder,我们可以轻松地从 HTTP 请求 (Servlet) 中获取标头并将它们传递到我们想要的任何地方。例如,我们在每个 Feign-request 中添加它们:
class CustomRequestInterceptor : RequestInterceptor {
override fun apply(template: RequestTemplate) {
val requestAttributes = RequestContextHolder.getRequestAttributes() as ServletRequestAttributes?
requestAttributes?.request?.let { request ->
request.headerNames.toList()
.forEach { name -> template.header(name, request.getHeader(name)) }
}
}
}
对于 Kafka Producers,有 ProducerInterceptor。
但是有没有办法捕获 ConsumerRecord 的标头并进一步传递它们?
我们计划使用 ThreadLocal 变量(如 RequestContextHolder 那样),但我们没有找到在此变量中设置和取消设置 Headers 的方法。
例如,我们可以在RecordInterceptor中传递Headers,但是当线程处理完当前记录时,我们无法清除我们的变量,所以下次我们使用这个线程时,我们可能会读取错误的headers (ThreadLocal 变量不会被清除)。
是否有任何接口/工具可以帮助我们?提前致谢!
【问题讨论】:
标签: java kotlin spring-kafka