我正在使用 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
。我认为该 ListenerContainerConsumerFailedEvent
的 Throwable
应该有一些信息。
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。