我正在使用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会被不同的值覆盖?
答案 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
处理,例如topic
,partition
,{ {1}}。
用两个词来说:我们不会在Kafka上传输标题,因为它不支持它们。