Spring Kafka监听器获取KafkaHeaders.RECORD_METADATA等Header报缺失错误
该问题和生产者无关,完全是消费者侧的配置与消费方法逻辑不匹配导致的,具体根因和解决方案如下:
根因分析
你在KafkaListenerContainerFactory中通过factory.setBatchListener(true)开启了批量监听模式,该模式下Spring Kafka会将一次拉取的所有消息统一封装,所有Payload、消息头属性都会以集合类型返回。你当前的消费方法定义的是单条消息的@Payload和单条@Header,框架无法匹配到对应的单条Header值,因此抛出Header缺失异常。
解决方案
提供两种可选方案,根据你的业务需求选择即可:
方案1:保留批量监听模式,调整消费方法参数
批量模式下需要使用集合类型接收批量消息和对应Header,修改后的消费方法示例如下:
@KafkaListener(topics = "testTopic", groupId = "testGroupId") public void consumeNotification(@Payload List<Request> requests, @Header(KafkaHeaders.RECORD_METADATA) List<RecordMetadata> recordMetaDataList) { // 遍历处理每一条消息和对应的元数据 for (int i = 0; i < requests.size(); i++) { Request request = requests.get(i); RecordMetadata metadata = recordMetaDataList.get(i); // 业务处理逻辑 } }
额外注意:需确保配置文件中spring.kafka.listener.type配置为batch,可按需调整spring.kafka.consumer.max-poll-records控制单次拉取的最大消息量。
方案2:关闭批量监听模式,适配现有单条消费逻辑
如果不需要批量消费,直接删除KafkaListenerContainerFactory中的factory.setBatchListener(true)配置,或将其值改为false即可,原有单条消费方法无需修改即可正常获取所有KafkaHeaders下的属性。
额外修正点
你当前@KafkaListener注解中使用的属性名topic是错误的,正确属性名为topics,否则项目启动阶段会抛出注解属性不合法的异常。
内容的提问来源于stack exchange,提问作者Debo
相关产品推荐
相关产品推荐

