Spring boot RabbitHandler在Spring中为侦听RabbitMQ的队列创建使用者并重试致命异常

Spring boot RabbitHandler在Spring中为侦听RabbitMQ的队列创建使用者并重试致命异常,spring-boot,rabbitmq,spring-amqp,spring-rabbit,Spring Boot,Rabbitmq,Spring Amqp,Spring Rabbit,我正在使用Spring AMQP RabbitHandler,并编写了以下代码: @RabbitListener(queues = "#{testQueue.name}") public class Tut4Receiver { @RabbitHandler public void receiveMessage(String message){ System.out.println("Message received "+message); } } 队列的定义如下:

我正在使用Spring AMQP RabbitHandler,并编写了以下代码:

@RabbitListener(queues = "#{testQueue.name}")
public class Tut4Receiver {

  @RabbitHandler
  public void receiveMessage(String message){
       System.out.println("Message received "+message);
  }
}
队列的定义如下:-

@Bean
public Queue testQueue() {
    return new AnonymousQueue();
}
我使用单独的代码初始化连接工厂

我的问题是,如果RabbitMQ停机一段时间,它会继续尝试创建使用者,但只有在它收到
ConnectionRejected
错误时才会这样做。但是,假设用户在RabbitMQ中不存在,并且存在创建新用户的间隙,那么它从RabbitMQ接收到一个致命错误,并且它从不重试,因此结果是在RabbitMQ上创建自动删除队列,而不使用任何使用者

堆栈跟踪:

    SimpleMessageListenerContainer] [SimpleAsyncTaskExecutor-11] [|] [|||] Consumer received fatal exception on startup 
org.springframework.amqp.rabbit.listener.exception.FatalListenerStartupException: Authentication failure
    at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:476)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1280)
    at java.lang.Thread.run(Thread.java:748)
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:309)
    at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createConnection(CachingConnectionFactory.java:547)
    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:472)
    ... 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:339)
    at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:813)
    at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:767)
    at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:887)
    at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:300)

 SimpleMessageListenerContainer] [SimpleAsyncTaskExecutor-11] [|] [|||] Stopping container from aborted consumer 
  [|] [|||] Waiting for workers to finish. 
  [|] [|||] Successfully waited for workers to finish.

即使在用户不存在等致命异常情况下,是否有重试的方法?

默认情况下,身份验证失败被视为致命的,不会重试

您可以通过在侦听器容器上设置属性(
possibleAuthenticationFailureFailure
)来覆盖此行为。该属性不能作为启动属性使用,因此您必须重写启动的容器工厂

@Bean(name=“rabbitListenerContainerFactory”)
公共SimpleRableBitListenerContainerFactory SimpleRableBitListenerContainerFactory(
SimpleRableBitListenerContainerFactoryConfigurer配置器,连接工厂连接工厂){
SimpleRableBitListenerContainerFactory=新SimpleRableBitListenerContainerFactory();
configurer.configure(工厂、连接工厂);
factory.SetContainerConfiguration(smlc->smlc.SetPossibleAuthenticationFailureFailure(false));
返回工厂;
}

有没有在spring rabbit 1.6版上执行此操作的想法?1.6版不再受支持;它的上一次发布是在两年前。1.7.x应该在使用1.6.x的应用程序中工作,没有任何问题(尽管当前版本是2.1.10)。最新的1.7.x版本是1.7.14。