我是Spring Kafka的新朋友。我有一个微服务,它使用用户定义的对象kafka键发送消息。
1)第一个微服务使用密钥(它是MyKey对象的实例)向Kafka发送消息。
2)我需要做的是,聆听该主题并获得带有密钥的消息,并使用该密钥创建一个新密钥。
可以说消息是通过myKey密钥发送的。我想在监听器中做的是创建一个新的扩展密钥,如下所示:
@KafkaListener(groupId = Bindings.CONSUMER_GROUP_DATA_CLEANUP, topics = "users")
public void process( @Payload MyMessage myMessage){
MyExtended myExtendedKey= new MyExtendedKey(myKey.getX(), myKey.getY());
....
....
kafkaTemplate.send(TOPIC, myExtendedKey, message);
}
我不知道如何获取在侦听器中发送的消息的密钥。
答案 0 :(得分:2)
...
最后,有关消息的元数据可从消息头获得。您可以使用以下标头名称来检索邮件的标头:
KafkaHeaders.RECEIVED_MESSAGE_KEY
KafkaHeaders.RECEIVED_TOPIC
KafkaHeaders.RECEIVED_PARTITION_ID
KafkaHeaders.RECEIVED_TIMESTAMP
KafkaHeaders.TIMESTAMP_TYPE
以下示例显示了如何使用标题:
@KafkaListener(id = "qux", topicPattern = "myTopic1")
public void listen(@Payload String foo,
@Header(KafkaHeaders.RECEIVED_MESSAGE_KEY) Integer key,
@Header(KafkaHeaders.RECEIVED_PARTITION_ID) int partition,
@Header(KafkaHeaders.RECEIVED_TOPIC) String topic,
@Header(KafkaHeaders.RECEIVED_TIMESTAMP) long ts
) {
...
}
偏移量也可用。
答案 1 :(得分:0)
使用@KafkaListener获取消息的键,值和元数据的最简单方法是在您的KafkaListener函数中使用ConsumerRecord,而不是仅接收有效载荷作为值记录。
@KafkaListener(topics = "any-topic")
void listener(ConsumerRecord<String, String> record) {
System.out.println(record.key());
System.out.println(record.value());
System.out.println(record.partition());
System.out.println(record.topic());
System.out.println(record.offset());
}
没有漂亮的注释,但可以使用。另外,如果您想从Kafka主题接收记录,处理这些记录,并将它们再次发送到另一个Kafka主题,我建议您看一下Kafka Streams API。