Spring Cloud下@StreamListener关自动提交仍无Acknowledgement头问题
问题解决方案
1. 确认绑定名称匹配
你当前application.yml中配置手动提交的绑定名为ens-notify-request,需要和INotifyRequestEventChannel.TOPIC_NAME_NOTIFY_REQUEST_EVENTS对应的通道绑定名完全一致,否则手动提交的配置不会作用到你监听的通道上,自然不会注入Acknowledgment对象。
2. 修正配置适配版本
根据你使用的Spring Cloud Stream版本调整配置:
- 2.x版本:保留你当前的配置即可,确认无全局配置覆盖绑定级别的手动提交规则
- 3.x及以上版本:
autoCommitOffset属性已废弃,仅保留acknowledge-mode: manual配置即可,配置参考如下:
spring: cloud: stream: kafka: bindings: ens-notify-request: # 此处需和你的实际监听绑定名完全一致 consumer: acknowledge-mode: manual
3. 调整监听代码获取方式
优先使用方法参数直接注入Acknowledgment,比从消息头中获取兼容性更高,调整后的代码示例:
@StreamListener(target = INotifyRequestEventChannel.TOPIC_NAME_NOTIFY_REQUEST_EVENTS) public void handleEvents(Message<?> message, Acknowledgment acknowledgment) { long startTime = System.currentTimeMillis(); logger.info("Notify Request event received headers=[{}], payload=[{}]", message.getHeaders(), message.getPayload()); try { logger.info("Before handleNotifyRequest acknowledgment = {} ",acknowledgment); // 业务处理完成后调用ack方法提交偏移量 acknowledgment.acknowledge(); } catch (Exception e) { // 异常处理逻辑,可选择不提交或者重试 } }
4. 版本兼容校验
确认你项目中引入的spring-cloud-stream-binder-kafka依赖版本和Spring Boot核心版本匹配,版本不兼容会导致消息头注入异常。
内容的提问来源于stack exchange,提问作者Anant Bhatnagar
相关产品推荐
相关产品推荐

