DirectMessageListenerContainer:如何在RabbitMQ中处理队列删除?

时间:2019-03-18 07:05:28

标签: spring-boot rabbitmq spring-amqp

我正在使用DirectMessageListenerContainer来使用RabbitMQ的数据。以下是我的情况:

我有两个与RabbitMQ交互的模块。第一个模块创建和删除队列,而第二个模块具有DirectMessageListenerContainer,它监听RabbitMQ中的队列。

无论何时在RabbitMQ中删除任何队列,DirectMessageListenerContainer都会连续引发异常并尝试连接到已删除的队列。

我的问题是,有什么办法可以处理异常并对此执行操作?

2 个答案:

答案 0 :(得分:1)

在一个模块中删除队列时,可以计划从容器中的那些队列取消订阅。查看其方法:

/**
 * Remove queue(s) from this container's list of queues.
 * @param queueNames The queue(s) to remove.
 * @return the boolean result of removal on the target {@code queueNames} List.
 */
public boolean removeQueueNames(String... queueNames) {

即使通过第二个模块中的ListenerContainerConsumerFailedEvent,您也可以只订阅@EventiListener应用程序来执行相同的removeQueueNames。我认为,Throwable中的ListenerContainerConsumerFailedEvent应该掌握一些信息,目前哪些队列很难使用。

答案 1 :(得分:0)

    boolean queueRemovedFromListener = false;
    DirectMessageListenerContainer listener = (DirectMessageListenerContainer) 
                registry.getListenerContainer("listener");
        List<String> queueNamesList = Arrays.asList(listener.getQueueNames());
        if(queueNamesList.contains(queueName)) {
            queueRemovedFromListener = listener.removeQueueNames(queueName);
        }
        if(queueRemovedFromListener) {
            Map<String, Object> arguments = new HashMap<String, Object>();
            Binding binding = new Binding(queueName, DestinationType.QUEUE, exchangeName, queueName,
                    arguments);
            rabbitAdmin.removeBinding(binding);
            rabbitAdmin.deleteQueue(queueName, false, true);
        }

如上一个答案中所建议,您可以传递队列名和交换名作为输入,并且使用removeQueueNames方法,您将能够从侦听器中删除队列并删除队列,而不会产生任何异常。