RabbitMQ客户端关闭MessageListener,无法恢复



我使用RabbitMQ AMQP 2.2.7。我有RabbitMQ集群在2个Spring引导应用程序之间运行。一个应用程序将一些消息发布到另一个。它运行了一段时间,但在过去几天里,我突然发现,使用消息的应用程序中的MessageListener由于某种原因而宕机(可能是主服务器节点宕机(。

   <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit</artifactId>
            <version>2.2.7.RELEASE</version>
   </dependency>
2020-07-22 00:26:33.007 ERROR 24 --- [tContainer#1-15] o.s.a.r.l.SimpleMessageListenerContainer : Stopping container from aborted consumer
Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - home node 'rabbit@rad497159-mq-1.node.dc1.a9ssvc' of durable queue 'ORDER' in vhost '/' is down or inaccessible, class-id=50, method-id=10)
Caused by: java.io.IOException: null
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:na]
2020-07-22 00:26:33.005 ERROR 24 --- [tContainer#1-15] o.s.a.r.l.SimpleMessageListenerContainer : Consumer threw missing queues exception, fatal=true
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.initialize(SimpleMessageListenerContainer.java:1350) ~[spring-rabbit-2.2.7.RELEASE.jar:2.2.7.RELEASE]
@Configuration
public class MessageConfiguration {
    public static final String ORDER_QUEUE_NAME = "ORDER";
    public static final String EXCHANGE = "directExchange";
    @Bean
    Queue deadLetterQueue() {
        return QueueBuilder.durable(ORDER_QUEUE_NAME).build();
    }
    @Bean
    public Queue orderQueue(){
        return QueueBuilder.durable(ORDER_QUEUE_NAME)
                .build();
    }
    @Bean
    public DirectExchange directExchange(){
        return new DirectExchange(EXCHANGE,true,false);
    }
    @Bean
    public Binding firstBinding(Queue orderQueue, DirectExchange directExchange){
        return BindingBuilder.bind(orderQueue).to(directExchange).with(ORDER_QUEUE_NAME);
    }
}
@RabbitListener(queues = MessageConfiguration.ORDER_QUEUE_NAME)
public void receiveOrder(final String orderString) {
}

问题是RabbitMQ消息侦听器无法确定地关闭,并且没有其他恢复方法。重新启动应用程序可以解决问题。所以我想有以下解决方案之一,但不知道如何做到

  1. 从SimpleMessageListener中侦听关闭通知并重新启动应用程序
  2. 在关闭侦听器之前使应用程序重试更多次

有人能提出一些建议吗?

stackoverflow中已经存在相同的问题,但没有解决方案(如何避免在出现意外错误时关闭SimpleMessageListenerContainer?(

home node 'rabbit@rad497159-mq-1.node.dc1.a9ssvc' of durable queue 'ORDER' in vhost '/' is down or inaccessible, class-id=50, method-id=10)

看起来您使用的是集群,但没有使用镜像(HA(队列。

在这种情况下,如果队列的主节点出现故障,您将得到该错误。

Consumer threw missing queues exception, fatal=true

如果将容器属性missingQueuesFatal设置为false,则容器将继续尝试,直到节点备份为止。

默认情况下,这是真的,容器将在间隔5秒的3次尝试后停止(默认情况下(。

最新更新