【问题标题】:Embedded headers found in Spring Cloud Stream message body在 Spring Cloud Stream 消息正文中找到的嵌入式标头
【发布时间】:2018-05-15 23:29:33
【问题描述】:

我使用 Spring Cloud Stream 1.3.2.RELEASE 将 String 消息发布到 Kafka。当我使用命令行 Kafka 消费者或 Spring Kafka @KafkaListener 使用消息时,总是会在消息正文中附加一个 contentType 标头。

问题

有没有办法摆脱嵌入的标题?

--

Spring Cloud Stream 作为生产者

private void send() {
    channel.test().send(MessageBuilder.withPayload("{\"foo\":\"bar\"}").build());
}

命令行 Kafka 消费者

$ bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test
�
 contentType
            "text/plain"{"foo":"bar"}

Spring Kafka 作为消费者

@KafkaListener(topics = "test")
public void receive(Message message){
    log.info("Message payload received: {}", message.getPayload());
}

2018-05-16 07:12:05.241  INFO 19475 --- [ntainer#0-0-C-1] com.demo.service.Listener  : Message payload received: �contentType"text/plain"{"foo":"bar"}

@KafkaListener(topics = "test")
public void receive(@Payload String message){
    log.info("Message payload received: {}", message);
}

2018-05-16 07:16:14.313  INFO 19747 --- [ntainer#0-0-C-1] com.demo.service.Listener  : Message payload received: �contentType"text/plain"{"foo":"bar"}

【问题讨论】:

    标签: spring apache-kafka kafka-consumer-api spring-cloud-stream spring-kafka


    【解决方案1】:

    请参阅headerMode 绑定属性:https://docs.spring.io/spring-cloud-stream/docs/Ditmars.SR3/reference/htmlsingle/#_properties_for_use_of_spring_cloud_stream。您需要将其设置为raw,作为您发送消息的目的地。

    【讨论】:

    • AFAIK,headerMode 是消费者财产,对吧?当我的消费者是命令行 Kafka 消费者或 Spring Kafka 时,它有什么帮助?
    • 请注意headerMode 也可以在发布端使用,docs.spring.io/spring-cloud-stream/docs/Ditmars.SR3/reference/…。我会试试看。
    • 如果我想让 Spring Cloud Stream 消费者(能够接收嵌入式标题)和非 Spring Cloud Stream 消费者(不会接收嵌入式标题)都使用嵌入标题的消息怎么办? ?
    • 好吧,然后考虑将相同的消息发送到两个不同的目的地:一个带有嵌入式标头,另一个 - 原始模式。
    猜你喜欢
    • 2017-11-18
    • 2020-11-02
    • 2017-11-18
    • 2019-04-19
    • 1970-01-01
    • 2017-05-18
    • 2016-06-20
    • 2020-09-28
    • 2021-06-12
    相关资源
    最近更新 更多