一次获取队列中的所有消息(Spring Boot JMSListerner注释)



我有一个特殊的需求,需要在队列中获取所有挂起的消息,以便进一步处理它们。阐述。下面是应用程序的流程:

  • 有一个队列设置将承载消息
  • 默认使用MessageListenerContainerstop()方法停止该队列的侦听器。
  • 通过调用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在评论中提到的,将消息移动到另一个队列。
  • 将消息从队列移动到文件。
  • 将消息从队列移动到数据库。

相关内容

  • 没有找到相关文章

最新更新