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



我正在使用 DirectMessageListenerContainer从兔子中消耗数据。以下是我的情况:

我有两个与兔子相互作用的模块。第一个模块创建并删除队列,而第二模块的DirectMessageListenerContainer则倾听兔子的队列。

每当在RabbitMQ中删除任何队列时,DirectMessageListenerContainer就会开始持续抛出异常,并尝试连接到已删除的队列。

我的问题是,有什么办法可以处理例外并执行我的操作?

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

/**
 * 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) {

您也可以通过第二个模块中的@EventiListener订阅ListenerContainerConsumerFailedEvent应用程序,以执行相同的removeQueueNames。我认为该 ListenerContainerConsumerFailedEventThrowable应该有一些信息。

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

如上一个答案所建议,您可以将queueName和Exchange名称作为输入和使用RemoveQueueNames方法,您将能够从侦听器中删除队列并删除队列而无需获得任何excpetions。

最新更新