我正在使用DirectMessageListenerContainer
来使用RabbitMQ的数据。以下是我的情况:
我有两个与RabbitMQ交互的模块。第一个模块创建和删除队列,而第二个模块具有DirectMessageListenerContainer
,它监听RabbitMQ中的队列。
无论何时在RabbitMQ中删除任何队列,DirectMessageListenerContainer
都会连续引发异常并尝试连接到已删除的队列。
我的问题是,有什么办法可以处理异常并对此执行操作?
答案 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方法,您将能够从侦听器中删除队列并删除队列,而不会产生任何异常。