Spring集成RabbitMQ创建消费队列报ACCESS_REFUSED错误咨询
Spring Boot整合RabbitMQ纯消费场景启动报ACCESS_REFUSED修复方案
错误核心原因
ACCESS_REFUSED是RabbitMQ服务端返回的权限类拒绝错误,你的实现存在账号权限、冗余配置两类问题,按以下步骤逐一排查修复即可。
1. 优先排查服务端权限与配置匹配问题
这是该类报错90%以上的触发原因:
- 校验账号基础访问权限:确认你使用的
people-consumer账号,已被授予PEOPLE虚拟主机的访问权限,未分配vhost权限会直接抛出ACCESS_REFUSED - 校验名称大小写:RabbitMQ对vhost、队列、交换机名称大小写敏感,确认配置文件里的
PEOPLEvhost、队列名、交换机名、路由键和服务端实际创建的资源名称完全一致 - 校验资源操作权限:你的配置类中声明了Queue、TopicExchange、Binding三个Bean,Spring启动时会主动向RabbitMQ发起资源创建声明,要求账号必须拥有对应资源的
configure(配置创建)、write(写)、read(读)权限:- 如果队列、交换机、绑定关系已经由生产消息的微服务提前创建完成,你作为纯消费端可以直接删掉配置类里的
queue()、exchange()、binding()三个声明Bean,避免启动时触发资源创建的权限校验,此时账号仅需要目标队列的消费读权限即可正常运行 - 如果需要消费端完成资源声明,联系MQ管理员给
people-consumer账号在PEOPLEvhost下配置匹配规则:configure权限正则覆盖你要创建的队列、交换机名称,read权限覆盖目标消费队列即可
- 如果队列、交换机、绑定关系已经由生产消息的微服务提前创建完成,你作为纯消费端可以直接删掉配置类里的
2. 清理配置类冗余错误配置
你当前的MQConfig类存在大量纯消费场景不需要的冗余配置,反而会引发异常:
- 删掉自定义的
connectionFactory()Bean:你已经在application.properties中配置了spring.rabbitmq.*前缀的连接参数,Spring Boot会自动生成适配的连接工厂实例,自定义实例额外开启了仅生产场景需要的publisherReturns=true配置,还缺失消费者相关的默认参数,没有存在必要 - 删掉重复定义的
AmqpTemplate template()、rabbitTemplate()两个Bean:纯消费场景不需要自定义RabbitTemplate,Spring自动装配的实例完全满足需求,重复定义会引发上下文冲突 - 如果确实需要消费端声明交换机,修正交换机声明的持久化配置,避免和服务端已存在的持久化交换机属性冲突:
@Bean public TopicExchange exchange() { // 三个参数分别是:交换机名、是否持久化、是否自动删除 return new TopicExchange(exchange, true, false); }
3. 监听器代码注意事项
- 确认
@Payload修饰的Message类导入的是org.springframework.amqp.core.Message,不要导错成其他包的Message类 - 如果需要直接获取反序列化后的业务对象,不需要手动解析Message,直接将@Payload的参数类型替换为对应的业务POJO类即可,你配置的
Jackson2JsonMessageConverter会自动完成报文反序列化。
验证前置步骤:修复前可以先登录RabbitMQ管理后台,用
people-consumer账号登录,确认能看到PEOPLEvhost下的qu-people-cores-update队列,且手动点击获取消息能正常拿到内容,再启动应用即可正常消费。
内容的提问来源于stack exchange,提问作者DiegoMG
相关产品推荐
相关产品推荐

