卡夫卡春季整合:卡夫卡消费者不会出现

时间:2015-08-19 20:13:12

标签: spring spring-integration apache-kafka

我正在使用Kafka Spring Integration来使用kafka发布和使用消息。我看到Payload正确地从生产者传递给消费者,但是头部信息在某处被覆盖。

@ServiceActivator(inputChannel = "fromKafka")
public void processMessage(Message<?> message) throws InterruptedException,
        ExecutionException {
    try {
            System.out.println("Headers :" + message.getHeaders().toString());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

我得到以下标题:

Headers :{timestamp=1440013920609, id=f8c645f7-677b-ec32-dad0-a7b79082ef81}

我在生产者端构建消息,如下所示:

Message<FeelDBMessage> message = MessageBuilder
                .withPayload(samplePayloadObj)
                .setHeader(KafkaHeaders.MESSAGE_KEY, "key")
                .setHeader(KafkaHeaders.TOPIC, "sampleTopic").build();

        // publish the message
        publisher.publishMessage(message);

及以下是生产者的标题信息:

 headers={timestamp=1440013914085, id=c4159c1c-2c67-634b-ef8d-3fb026b1172e, kafka_messageKey=key, kafka_topic=sampleTopic}

知道为什么Header会被不同的值覆盖?

1 个答案:

答案 0 :(得分:6)

仅仅因为默认情况下Framework使用 immutable GenericMessage

对现有消息的任何操作(例如MessageBuilder.withPayload)都将生成新的GenericMessage实例。

从另一方面来看,Kafka不支持任何headers抽象,如JMS或AMQP。这就是KafkaProducerMessageHandler在向Kafka发布消息时这样做的原因:

this.kafkaProducerContext.send(topic, partitionId, messageKey, message.getPayload());

如您所见,它根本不会发送headers。因此,其他方(消费者)仅将message作为payload主题处理,将某些系统选项作为headers处理,例如topicpartition,{ {1}}。

用两个词来说:我们不会在Kafka上传输标题,因为它不支持它们。