RabbitMQ ACCESS_REFUSED认证失败问题求助
问题:Spring Boot连接K8s部署的RabbitMQ本地认证失败
本人使用Spring Boot Java代码连接本地Kubernetes+Docker部署的RabbitMQ,昨日连接正常且同事可正常访问,但本地出现认证失败异常。此前STS 4.17.0出现无响应问题,已新建工作区并重新下载STS。通过抓包确认凭证已传递,该用户具备权限,但RabbitMQ日志无相关记录。同时怀疑属性加载存在竞态条件,偶尔会出现连接建立前属性未加载的情况。
异常信息
Caused by: com.rabbitmq.client.AuthenticationFailureException: ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile. at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:385) ~[amqp-client-5.16.0.jar:5.16.0] at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:1225) ~[amqp-client-5.16.0.jar:5.16.0] at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:1173) ~[amqp-client-5.16.0.jar:5.16.0] at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:1342) ~[amqp-client-5.16.0.jar:5.16.0] at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.connectHostPort(AbstractConnectionFactory.java:638) ~[spring-rabbit-3.0.0.jar:3.0.0] at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.connect(AbstractConnectionFactory.java:603) ~[spring-rabbit-3.0.0.jar:3.0.0] at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:550) ~[spring-rabbit-3.0.0.jar:3.0.0] at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createConnection(CachingConnectionFactory.java:686) ~[spring-rabbit-3.0.0.jar:3.0.0] at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.createConnection(ConnectionFactoryUtils.java:257) ~[spring-rabbit-3.0.0.jar:3.0.0] at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils$RabbitResourceFactory.createConnection(ConnectionFactoryUtils.java:345) ~[spring-rabbit-3.0.0.jar:3.0.0] at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.doGetTransactionalResourceHolder(ConnectionFactoryUtils.java:140) ~[spring-rabbit-3.0.0.jar:3.0.0] at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.getTransactionalResourceHolder(ConnectionFactoryUtils.java:102) ~[spring-rabbit-3.0.0.jar:3.0.0] at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.getTransactionalResourceHolder(ConnectionFactoryUtils.java:85) ~[spring-rabbit-3.0.0.jar:3.0.0] at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:613) ~[spring-rabbit-3.0.0.jar:3.0.0] at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.initialize(SimpleMessageListenerContainer.java:1378) ~[spring-rabbit-3.0.0.jar:3.0.0] at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1223) ~[spring-rabbit-3.0.0.jar:3.0.0] at java.lang.Thread.run(Thread.java:833) ~[?:?]
相关配置代码
ConnectionFactories配置类
@Configuration public class ConnectionFactories { private static Logger logger = LoggerFactory.getLogger(ConnectionFactories.class); @Autowired private AmqpSettings settings; @Autowired private QueueSettings queueSettings; private CachingConnectionFactory makeConnectionFactory(String host, int port, String username, String password, String virtualHost) throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException, CertificateException, FileNotFoundException, IOException { RabbitConnectionFactoryBean rabbitCF = new RabbitConnectionFactoryBean(); rabbitCF.setHost(host); rabbitCF.setPort(port); rabbitCF.setUsername(username); rabbitCF.setPassword(password); rabbitCF.setVirtualHost(virtualHost); return new CachingConnectionFactory(rabbitCF.getRabbitConnectionFactory()); } @Primary @Bean(name = { "mule4RabbitCachingConnectionFactory" }) @DependsOn(value = {"amqpSettings"}) CachingConnectionFactory mule4RabbitCachingConnectionFactory() throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException, CertificateException, FileNotFoundException, IOException { logger.info("Configuring mule4 Rabbit caching connection factory"); return makeConnectionFactory(settings.getHost(), settings.getPort(), settings.getUsername(), settings.getPassword(), queueSettings.getMule4VirtualHost()); } @Bean @Qualifier("mule4RabbitCachingConnectionFactory") SimpleRabbitListenerContainerFactory mule4RabbitListenerContainerFactory( SimpleRabbitListenerContainerFactoryConfigurer configurer, @Qualifier("mule4RabbitCachingConnectionFactory") ConnectionFactory connectionFactory) throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException, CertificateException, FileNotFoundException, IOException { logger.info("Configuring mule4 Rabbit listener factory"); SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); configurer.configure(factory, connectionFactory); factory.setMaxConcurrentConsumers(20); factory.setConcurrentConsumers(20); factory.setMessageConverter(new QueueMessageConverter()); factory.setDefaultRequeueRejected(Boolean.FALSE); return factory; } }
AmqpSettings配置类
@ConfigurationProperties("queue.rabbitmq") @Component public class AmqpSettings { private String host; private Integer port; private String username; private String password; public String getHost() { return host; } public void setHost(String host) { this.host = host; } public Integer getPort() { return port; } public void setPort(Integer port) { this.port = port; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
解决思路
- 验证配置加载时机:在
mule4RabbitCachingConnectionFactory方法中打印settings的所有属性值,确认创建连接工厂时配置是否已正确加载。若出现空值,改用构造函数注入替代@Autowired,确保依赖完全初始化后再创建Bean。 - 清理本地缓存:删除STS的本地Maven缓存(
.m2/repository)和项目的target目录,重新构建项目,排除旧配置或依赖缓存的影响。 - 确认虚拟主机权限:通过RabbitMQ管理控制台,再次检查本地连接使用的虚拟主机对应用户是否拥有配置、读写权限,避免权限配置不一致。
- 命令行测试连接:使用
rabbitmqadmin工具直接在本地测试连接,命令格式:rabbitmqadmin -H <host> -P <port> -u <username> -p <password> -V <vhost> list queues,排查代码之外的网络或RabbitMQ实例问题。 - 延迟连接初始化:设置
CachingConnectionFactory的setAutoStartup(false),在应用启动完成后手动触发连接;或添加@Lazy注解延迟连接工厂初始化,确保所有配置加载完成。 - 调整RabbitMQ日志级别:将RabbitMQ日志级别临时调整为debug,重启实例后再次触发连接,查看认证相关的详细日志,定位拒绝原因。
内容的提问来源于stack exchange,提问作者user4122863
相关产品推荐
相关产品推荐

