我有一个特殊的需求,需要在队列中获取所有挂起的消息,以便进一步处理它们。阐述。下面是应用程序的流程:
- 有一个队列设置将承载消息
- 默认使用
MessageListenerContainer
的stop()
方法停止该队列的侦听器。 - 通过调用
listenerContainer.start()
按需收听队列上的消息 - 要求是我应该立即获得队列上可用的所有消息,因此只有这些消息要被处理。如果由于某种原因,在处理现有消息期间将新消息发布到队列上,那么这些消息应该保留在队列本身上。这些将在稍后按需调用
listenerContainer.start();
时再次读取。 例如:
-
假设我们有一个名为
abc-queue
的队列。有一个JMS侦听器配置为:@JmsListener(destination = "abc-queue", containerFactory = "abcFactory", selector = "_type='java.util.LinkedHashMap'", id = "abc-listener")
-
在应用程序启动时,我们将这样做:
MessageListenerContainer listenerContainer = jmsListenerEndpointRegistry.getListenerContainer("abc-listener"); listenerContainer.stop();
-
App将有一个控制器端点来根据需要侦听这个队列。一旦调用了该函数,就会发生以下情况:
MessageListenerContainer listenerContainer = jmsListenerEndpointRegistry.getListenerContainer("abc-listener"); listenerContainer.start(); // now read all the messages in queue at once and store them in a list // listenerContainer.stop(); // start processing the messages one by one
问题:
- 我们如何一次读取所有消息并将它们存储在列表中?
- 即使队列中存在消息,
listenerContainer.start()
也不会立即开始处理队列。只有当另一条消息出现在队列中时才会触发。
任何有用的指针都是值得赞赏的。
可能的解决方案:
- 就像Daniel在评论中提到的,将消息移动到另一个队列。
- 将消息从队列移动到文件。
- 将消息从队列移动到数据库。