RabbitMQ Client关闭MessageListener无法恢复
RabbitMQ Client shuts down the MessageListener and cannot be recovered
我使用 RabbitMQ AMQP 2.2.7。我在 2 Spring 引导应用程序之间有 RabbitMQ 集群 运行。一个应用程序向另一个应用程序发布一些消息。 运行 有一段时间很好,但最近几天突然,我看到应用程序中使用消息的 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 消息侦听器无限期关闭并且没有其他方法可以恢复。重新启动应用程序可解决问题。所以我想要以下解决方案之一,但不知道该怎么做
- 监听来自SimpleMessageListener的关闭通知并重启应用程序
- 让应用程序在关闭侦听器之前重试更多次
有人可以建议一些方法吗?
Whosebug中已经有同样的问题没有解决方案(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
如果您将容器 属性 missingQueuesFatal
设置为 false
,容器将继续尝试直到节点备份。
默认情况下,这是真的,容器将在间隔 5 秒的 3 次尝试后停止(默认情况下)。
我使用 RabbitMQ AMQP 2.2.7。我在 2 Spring 引导应用程序之间有 RabbitMQ 集群 运行。一个应用程序向另一个应用程序发布一些消息。 运行 有一段时间很好,但最近几天突然,我看到应用程序中使用消息的 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 消息侦听器无限期关闭并且没有其他方法可以恢复。重新启动应用程序可解决问题。所以我想要以下解决方案之一,但不知道该怎么做
- 监听来自SimpleMessageListener的关闭通知并重启应用程序
- 让应用程序在关闭侦听器之前重试更多次
有人可以建议一些方法吗?
Whosebug中已经有同样的问题没有解决方案(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
如果您将容器 属性 missingQueuesFatal
设置为 false
,容器将继续尝试直到节点备份。
默认情况下,这是真的,容器将在间隔 5 秒的 3 次尝试后停止(默认情况下)。