【问题标题】:Passing headers From Kafka ConsumerRecord to Kafka ProducerRecord / RestTemplate / Feign将标头从 Kafka ConsumerRecord 传递到 Kafka ProducerRecord / RestTemplate / Feign
【发布时间】: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


    【解决方案1】:

    【讨论】:

    • 加里,非常感谢!似乎您的解决方案正是我们正在寻找的。我们目前使用的是 Spring Boot 2.4.2 (spring-kafka 2.6.5),所以这是更新我们的依赖项的好理由。
    猜你喜欢
    • 1970-01-01
    • 2019-05-20
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    相关资源
    最近更新 更多