我必须使用@Payload spring注释来读取Kafka消息吗



Spring for Apache Kafka 2.8.4https://docs.spring.io/spring-kafka/reference/html显示了消息旁边带有@Payload注释的一些侦听器方法,而有些没有。例如:

@KafkaListener(id = "cat", topics = "myTopic",
containerFactory = "kafkaManualAckListenerContainerFactory")
public void listen(String data, Acknowledgment ack) {
...
ack.acknowledge();
}

@KafkaListener(id = "qux", topicPattern = "myTopic1")
public void listen(@Payload String foo,
@Header(name = KafkaHeaders.RECEIVED_MESSAGE_KEY, required = false) Integer key,
@Header(KafkaHeaders.RECEIVED_PARTITION_ID) int partition,
@Header(KafkaHeaders.RECEIVED_TOPIC) String topic,
@Header(KafkaHeaders.RECEIVED_TIMESTAMP) long ts
) {
...
}

什么方法是正确的?我正在测试两者,没有发现差异。

简短的答案是否定的,您不必使用它。

长话短说的答案是";这取决于";;如果你想对Kafka消息进行一些验证,@Payload会帮你;如以下来自春季文档

要配置@KafkaListener来处理null有效负载,您必须使用required=false的@Payload注释。如果它是压缩日志的逻辑删除消息,则通常还需要密钥,以便应用程序可以确定哪个密钥被"删除"。以下示例显示了这样的配置:

我更喜欢使用普通的String,这样你就可以将责任转移到应用程序端,而不是Spring处理的内置方式,从而避免一些已知的解析问题,比如毒丸。

最新更新