Java 手动删除RabbitMQ后重新创建队列

Java 手动删除RabbitMQ后重新创建队列,java,rabbitmq,queue,Java,Rabbitmq,Queue,手动删除队列后,是否可以自动重新创建队列 我可以在启动时使用 @Bean public Queue createRandomQueue(@Qualifier("exporterRabbitAdmin") RabbitAdmin exporterRabbitAdmin) { Queue queue = createQueue("random.queue", exporterRabbitAdmin); exporterRabbitAdmin.d

手动删除队列后,是否可以自动重新创建队列

我可以在启动时使用

@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]
org.springframework.amqp.rabbit.listener.BlockingQueueConsumer$DeclarationException:未能声明队列:[random.queue]
在org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.attemptPassiveDeclarations(BlockingQueueConsumer.java:710)[spring-rabbit-2.1.4.RELEASE.jar:2.1.4.RELEASE]
位于org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.被动式声明(BlockingQueueConsumer.java:594)[spring-rabbit-2.1.4.RELEASE.jar:2.1.4.RELEASE]
在
原因:com.rabbitmq.client.ShutdownSignalException:通道错误;协议方法:#方法(回复代码=404,回复文本=未找到-vhost'default'中没有队列'export hub activity.retry.queue',类id=50,方法id=10)
在com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:66)~[amqp-client-5.4.3.jar:5.4.3]
在com.rabbitmq.utility.BlockingValueOrException.unterruptiblegetvalue(BlockingValueOrException.java:36)~[amqp-client-5.4.3.jar:5.4.3]

是的,您可以重新创建已删除的队列。在RabbitMQ中,每个操作都是一个事件。当一个队列被删除时,它被记录为一个事件,这些事件可以像普通消息一样被使用

您可以通过启用插件来启用RabbitMQ事件。设置后,将其绑定到队列。在使用事件队列中的消息时,需要检查是否包含
queue.deleted
。如果存在任何此类消息,则可以重新创建队列。
queue.deleted
事件还将包含
队列名称
虚拟主机

参考资料:

对于感兴趣的人:

我在队列中使用了不同的虚拟主机,因此在启用插件之前,我必须修改rabbitmq.config并添加以下代码

{rabbitmq_event_exchange, [{vhost, <<"default">>}]}
最后创建了一个侦听器来侦听“my_event_queue”队列,并在收到queue.deleted事件时动态重新创建队列

 @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;
}