java - RabbitMQ Client关闭MessageListener无法恢复

标签 java spring-boot rabbitmq spring-rabbit

我使用 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 消息监听器关闭了 indefinitley 并且没有其他方法可以恢复。重新启动应用程序即可解决问题。所以我想要以下解决方案之一,但不知道该怎么做
  • 监听来自 SimpleMessageListener 的关闭通知并重新启动应用程序
  • 在关闭监听器之前使应用程序重试更多次

  • 有人可以建议一些方法吗?
    在没有解决方案的 stackoverflow 中已经存在同样的问题 ( How to avoid shutdown of SimpleMessageListenerContainer in case of unexpected errors? )

    最佳答案

    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


    如果设置容器属性 missingQueuesFatalfalse ,容器将继续尝试,直到节点备份。
    默认情况下,这是 true 并且容器将在间隔 5 秒(默认情况下)3 次尝试后停止。

    关于java - RabbitMQ Client关闭MessageListener无法恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63036460/

    相关文章:

    spring-boot - 单元测试 Spring Boot 应用服务层

    linux - 在 linux 上安装 rabbitmqadmin

    php - 连接时rabbitmq错误

    php - 当 RabbitMQ 有消息时,它会为消费者调用回调函数吗?

    java - 如何在运行时创建指定类类型的对象?

    JAVA创建Json数组不带引号

    java - 抽象类中的 protected 数据

    java - Spring Data Rest - Bean 验证未应用于 PUT 方法?

    java - Windows 7中的JPA Eclipselink查询解析问题

    java - 在控制台中打印彩色文本(Windows、Mac、Linux)