【问题标题】:Change the behaviour in Spring Cloud Stream. Make header matcher case sensitive更改 Spring Cloud Stream 中的行为。使标头匹配器区分大小写
【发布时间】:2021-07-16 16:46:25
【问题描述】:

我需要我的自定义“Id”kafka 标头,并且不想要 Spring Kafka Streams 中的“id”标头。

受保护的静态类 SimplePatternBasedHeaderMatcherpublic boolean matchHeader 方法中使用 toLowerCase() 逻辑。

所以最后我得到了两个标题:“Id”(我的标题)和“id”(由 Spring Cloud Stream 提供)。

如果我不需要不区分大小写的标头匹配器,如何通过 yaml 属性覆盖此行为?

【问题讨论】:

    标签: spring-cloud-stream spring-cloud-stream-binder-kafka


    【解决方案1】:

    您不能只在 YAML 中执行此操作,您必须创建一个自定义标头映射器 bean 并在 YAML 中提供它的名称。

    https://docs.spring.io/spring-cloud-stream-binder-kafka/docs/3.1.3/reference/html/spring-cloud-stream-binder-kafka.html#_kafka_binder_properties

    spring.cloud.stream.kafka.binder.headerMapperBeanName

    KafkaHeaderMapper 的 bean 名称,用于将 spring-messaging 标头与 Kafka 标头进行映射。

    【讨论】:

    • 我明白了。对我来说看起来很合理。将尝试遵循这一点。非常感谢@Gary Russell!
    • 也就是说,不清楚是什么问题。 id 标头从不映射到出站,并且模式仅在那里使用。在入站时,idtimestamp 在消息发生变异时始终会更改。它们是 spring-messaging 的固有特征,并且始终存在。
    • 问题如下。我的生产者的标头包含两个“id”,它是由于配置 DefaultKafkaHeaderMapper bean 而提供的:DefaultKafkaHeaderMapper("SystemTime", "AppId", "Id"...) 和我的“Id”标头,它被放入 producerKafkaHeaders 像这样: Message message = MessageBuilder .withPayload(abstractMessage) .copyHeaders(producerKafkaHeaders) .build();所以最终制作人的标题包含:“id”和“id”,这对我来说很奇怪。
    • 所以最终将 bean 从 DefaultKafkaHeaderMapper 更改为具有相同 bean 配置的 SimpleKafkaHeaderMapper 解决了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2022-06-13
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多