首页 > 解决方案 > 分页 JMS 队列

问题描述

在我的 Java EE 应用程序中,我使用 JMS 来存储一些消息。我想在 JSF 分页表中显示这些消息。如何批量获取队列中的消息?目前我正在使用这样的东西,但这不是很好,因为我需要遍历许多消息。

这可以实现吗?我正在将 JBoss 与 HornetQ 一起使用。

browser = session.createBrowser(queue);
List<Message> messagesToReturn = new ArrayList<>();
final Enumeration<ObjectMessage> messages = browser.getEnumeration();
int messagesSoFar = 0;
int count = 0;

while(messages.hasMoreElements()) {
    ObjectMessage message = messages.nextElement();
    if (count >= offset) {
        messagesToReturn.add(new CGSQueueMessage(message));
        messagesSoFar += 1;
    }
    if (messagesSoFar == maxSelect) {
        break;
    }
    count += 1;
}
return messagesToReturn;

标签: javajbossjmshornetq

解决方案


对于像您这样的分页用例,JMS API 中没有用于批量从队列中获取消息的方法。

您可以将队列浏览器中的所有消息读入您自己的数据结构并使用它进行分页。

如果有太多消息无法一次将它们全部放入内存数据结构中,那么您可以尽可能多地读取它们可以合理地放入内存(这可能会比用户在任何给定页面上看到的更多)这将作为您自己的应用程序级页面,您可以使用它来提供用户级页面。这将减少您需要循环浏览队列浏览器的次数。

除此之外,您可以将队列浏览器中的所有消息转储到一个临时的随机访问文件中,然后从中提取结果。

综上所述,我认为您的用例最终不适合像 JMS 这样的消息传递 API。在我看来,我认为您更适合使用可以轻松支持此用例的数据库之类的东西。


推荐阅读