在春季启动Kafka监听器中接收Kafka密钥

时间:2019-09-26 09:37:15

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

我是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);
      }

我不知道如何获取在侦听器中发送的消息的密钥。

2 个答案:

答案 0 :(得分:2)

read the documentation

  

...

     

最后,有关消息的元数据可从消息头获得。您可以使用以下标头名称来检索邮件的标头:

     

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。

相关问题