RabbitMQ消费异常:首条消息后停止消费且消息重复
问题分析与解决方案
问题根源
出现重复消费、消费线程终止并抛出java.lang.NoClassDefFoundError的核心原因是依赖版本冲突:
- 项目使用Spring Boot 2.2.4.RELEASE作为父依赖,该版本对应的Spring框架版本是5.2.3.RELEASE,
spring-boot-starter-amqp已经间接引入了适配版本的spring-messaging。 - 但手动添加了
spring-messaging 4.2.4.RELEASE,这个版本远低于Spring Boot 2.2.4要求的版本,其中并不包含org.springframework.messaging.handler.invocation.MethodArgumentResolutionException类,导致消费线程处理异常时无法找到该类,进而线程终止。 - 线程异常终止后,消息未被正确确认,RabbitMQ会将消息重新放回队列,导致重复消费;同时消费者容器因线程中止停止,无法处理后续消息。
解决方案
移除手动指定的低版本spring-messaging依赖
直接删除pom.xml中这段配置:<dependency> <groupId>org.springframework</groupId> <artifactId>spring-messaging</artifactId> <version>4.2.4.RELEASE</version> </dependency>spring-boot-starter-amqp已经包含了适配当前Spring Boot版本的spring-messaging,无需手动引入。强制更新依赖并清理缓存
执行Maven命令清理并重新加载依赖:mvn clean install -U验证消息确认机制(可选)
如果依赖修复后仍有重复消费问题,检查消息监听的确认配置:- 使用
@RabbitListener时默认是自动确认模式,确保消费逻辑没有抛出未捕获的异常(异常会导致自动确认失效,消息重回队列)。 - 若使用手动确认模式,确保消费成功后调用
channel.basicAck()确认消息。
- 使用
内容的提问来源于stack exchange,提问作者Prithivi Thiyagu
相关产品推荐
相关产品推荐

