Java SpringRMQ侦听器始终使用普通身份验证,即使在配置SSL属性之后也是如此

Java SpringRMQ侦听器始终使用普通身份验证,即使在配置SSL属性之后也是如此,java,spring,spring-boot,spring-rabbit,Java,Spring,Spring Boot,Spring Rabbit,我有一个spring启动应用程序,我正在尝试将侦听器配置为现有队列。以下是我在应用程序.yml文件中配置的内容。我还用@enablebrabbit注释了我的config类,用@RabbitListener注释了侦听器,并引用了spring文档中的适当配置 请注意,每个属性都有一个有效的默认值,我在这里发布之前已经删除了它们 spring: rabbitmq: host: ${rmq_host} port: ${rmq_port} virtualHost: ${rmq_

我有一个spring启动应用程序,我正在尝试将侦听器配置为现有队列。以下是我在
应用程序.yml
文件中配置的内容。我还用
@enablebrabbit
注释了我的config类,用
@RabbitListener
注释了侦听器,并引用了spring文档中的适当配置

请注意,每个属性都有一个有效的默认值,我在这里发布之前已经删除了它们

spring:
  rabbitmq:
    host: ${rmq_host}
    port: ${rmq_port}
    virtualHost: ${rmq_virtual_host}
    requestedHeartbeat: ${rmq_requested_heartbeat_seconds}
    listener:
      simple:
        concurrency: ${rmq_listener_config_concurrent_users}
        autoStartup: ${rmq_listener_config_auto_startup}
        acknowledge-mode: ${rmq_listener_config_ack_mode}
    ssl:
      enabled: ${rmq_ssl_enabled:true}
      keyStore: ${rmq_ssl_keystore}
      keyStorePassword: ${rmq_ssl_keystore_password}
      trustStore: ${rmq_ssl_truststore}
      trustStorePassword: ${rmq_ssl_truststore_password}
使用此配置,当我尝试启动应用程序时,它会抛出以下异常

org.springframework.amqp.rabbit.listener.exception.FatalListenerStartupException: Authentication failure
    at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:532)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1389)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.springframework.amqp.AmqpAuthenticationException: com.rabbitmq.client.AuthenticationFailureException: ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile.
    at org.springframework.amqp.rabbit.support.RabbitExceptionTranslator.convertRabbitAccessException(RabbitExceptionTranslator.java:65)
    at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:368)
    at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createConnection(CachingConnectionFactory.java:565)
    at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils$1.createConnection(ConnectionFactoryUtils.java:90)
    at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.doGetTransactionalResourceHolder(ConnectionFactoryUtils.java:140)
    at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.getTransactionalResourceHolder(ConnectionFactoryUtils.java:76)
    at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:527)
    ... 2 common frames omitted
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:342)
    at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:909)
    at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:859)
    at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:799)
    at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:352)
    ... 7 common frames omitted

在编写producer时,我发现了相同的错误,通过将sasl配置设置为EXTERNAL解决了这个问题,但我可以这样做,因为我自己编写配置bean,这里我尝试使用spring的开箱即用支持。

好的,下面是我的发现。有一个关于spring boot的文章提到,由于在使用spring boot时无法配置sasl,所以它总是使用普通的身份验证模式,并且有一个解决方法使我的代码按预期工作。下面是我添加的配置类

@Configuration
public class RabbitMQConfig {

    @Autowired
    private RabbitProperties rabbitProperties;

    @Autowired
    private CachingConnectionFactory cachingConnectionFactory;

    @PostConstruct
    public void init() {
        if ( rabbitProperties.getSsl().isEnabled() && rabbitProperties.getSsl().getKeyStore() != null ) {
            cachingConnectionFactory.getRabbitConnectionFactory().setSaslConfig( DefaultSaslConfig.EXTERNAL );
        }
    }

}