Повторное создание очереди после удаления вручную RabbitMQ - PullRequest
1 голос
/ 10 июля 2020

Можно ли автоматически воссоздать очередь после того, как она была удалена вручную?

Я могу создать очередь при запуске, используя

@Bean
public Queue createRandomQueue(@Qualifier("exporterRabbitAdmin") RabbitAdmin exporterRabbitAdmin) {
    Queue queue = createQueue("random.queue", exporterRabbitAdmin);
    exporterRabbitAdmin.declareQueue(queue);
    return queue;
}

Однако, если он вручную удален из rabbitmq, я хочу иметь возможность автоматически создавать очередь с тем же именем.

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Да, вы можете заново создать очередь, которую вы удалили. В RabbitMQ каждая операция - это событие. Когда очередь удаляется, она записывается как событие, и эти события можно использовать как обычные сообщения.

Вы можете включить события RabbitMQ, включив плагин rabbitmq_event_exchange . Как только он будет установлен, привяжите его к очереди. При использовании сообщений из очереди событий вам необходимо проверить сообщение, содержащее queue.deleted. Если есть такое сообщение, вы можете заново создать очередь. Событие queue.deleted также будет содержать queue name и virtual host

Ссылка: https://www.rabbitmq.com/event-exchange.html

0 голосов
/ 13 июля 2020

Для заинтересованных:

Я использовал другой виртуальный хост для своих очередей, поэтому мне пришлось изменить 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

...