在手动删除 RabbitMQ 后重新创建队列
Re-creating a queue afters its manually deleted RabbitMQ
是否可以在手动删除队列后自动重新创建队列?
我可以使用
在启动时创建队列
@Bean
public Queue createRandomQueue(@Qualifier("exporterRabbitAdmin") RabbitAdmin exporterRabbitAdmin) {
Queue queue = createQueue("random.queue", exporterRabbitAdmin);
exporterRabbitAdmin.declareQueue(queue);
return queue;
}
但是,如果它是从 rabbitmq 中手动删除的,我希望能够自动创建一个同名队列。
今天如果我删除它,我会继续抛出异常
org.springframework.amqp.rabbit.listener.BlockingQueueConsumer$DeclarationException: Failed to declare queue(s):[random.queue]
at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.attemptPassiveDeclarations(BlockingQueueConsumer.java:710) [spring-rabbit-2.1.4.RELEASE.jar:2.1.4.RELEASE]
at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.passiveDeclarations(BlockingQueueConsumer.java:594) [spring-rabbit-2.1.4.RELEASE.jar:2.1.4.RELEASE]
at ....
Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no queue 'export-hub-activity.retry.queue' in vhost 'default', class-id=50, method-id=10)
at com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:66) ~[amqp-client-5.4.3.jar:5.4.3]
at com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java:36) ~[amqp-client-5.4.3.jar:5.4.3]
是的,您可以重新创建已删除的队列。在 RabbitMQ 中,每个操作都是一个事件。当一个队列被删除时,它被记录为一个事件,这些事件可以像普通消息一样被消费。
您可以通过启用 rabbitmq_event_exchange 插件来启用 RabbitMQ 事件。设置完成后,将其绑定到队列。在使用来自事件队列的消息时,您需要检查包含 queue.deleted
的消息。如果有任何此类消息,您可以重新创建队列。 queue.deleted
事件还将包含 queue name
和 virtual host
对于那些感兴趣的人:
我为我的队列使用了不同的虚拟主机,所以我必须修改 rabbitmq.config 并在启用插件之前添加以下代码
{rabbitmq_event_exchange, [{vhost, <<"default">>}]}
** 这里的“默认”是我的虚拟主机,开箱即用的虚拟主机是“/”
我还创建了一个队列来监听插件创建的交换
@Bean
public Queue exporterRabbitMqEvents(RabbitAdmin rabbitAdmin) {
Queue queue = createQueue("my_event_queue", rabbitAdmin);
exporterRabbitAdmin.declareQueue(queue);
Binding binding =
new Binding("my_event_queue",
Binding.DestinationType.QUEUE,
"amq.rabbitmq.event", "queue.deleted", null);
exporterRabbitAdmin.declareBinding(binding);
return queue;
}
最后创建了一个侦听器来侦听“my_event_queue”队列并在我收到 queue.deleted 事件时动态重新创建队列
是否可以在手动删除队列后自动重新创建队列?
我可以使用
在启动时创建队列@Bean
public Queue createRandomQueue(@Qualifier("exporterRabbitAdmin") RabbitAdmin exporterRabbitAdmin) {
Queue queue = createQueue("random.queue", exporterRabbitAdmin);
exporterRabbitAdmin.declareQueue(queue);
return queue;
}
但是,如果它是从 rabbitmq 中手动删除的,我希望能够自动创建一个同名队列。
今天如果我删除它,我会继续抛出异常
org.springframework.amqp.rabbit.listener.BlockingQueueConsumer$DeclarationException: Failed to declare queue(s):[random.queue]
at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.attemptPassiveDeclarations(BlockingQueueConsumer.java:710) [spring-rabbit-2.1.4.RELEASE.jar:2.1.4.RELEASE]
at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.passiveDeclarations(BlockingQueueConsumer.java:594) [spring-rabbit-2.1.4.RELEASE.jar:2.1.4.RELEASE]
at ....
Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no queue 'export-hub-activity.retry.queue' in vhost 'default', class-id=50, method-id=10)
at com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:66) ~[amqp-client-5.4.3.jar:5.4.3]
at com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java:36) ~[amqp-client-5.4.3.jar:5.4.3]
是的,您可以重新创建已删除的队列。在 RabbitMQ 中,每个操作都是一个事件。当一个队列被删除时,它被记录为一个事件,这些事件可以像普通消息一样被消费。
您可以通过启用 rabbitmq_event_exchange 插件来启用 RabbitMQ 事件。设置完成后,将其绑定到队列。在使用来自事件队列的消息时,您需要检查包含 queue.deleted
的消息。如果有任何此类消息,您可以重新创建队列。 queue.deleted
事件还将包含 queue name
和 virtual host
对于那些感兴趣的人:
我为我的队列使用了不同的虚拟主机,所以我必须修改 rabbitmq.config 并在启用插件之前添加以下代码
{rabbitmq_event_exchange, [{vhost, <<"default">>}]}
** 这里的“默认”是我的虚拟主机,开箱即用的虚拟主机是“/”
我还创建了一个队列来监听插件创建的交换
@Bean
public Queue exporterRabbitMqEvents(RabbitAdmin rabbitAdmin) {
Queue queue = createQueue("my_event_queue", rabbitAdmin);
exporterRabbitAdmin.declareQueue(queue);
Binding binding =
new Binding("my_event_queue",
Binding.DestinationType.QUEUE,
"amq.rabbitmq.event", "queue.deleted", null);
exporterRabbitAdmin.declareBinding(binding);
return queue;
}
最后创建了一个侦听器来侦听“my_event_queue”队列并在我收到 queue.deleted 事件时动态重新创建队列