分页 JMS 队列

Paginating JMS Queue

在我的 Java EE 应用程序中,我使用 JMS 来存储一些消息。我想在分页 table 的 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;

JMS API 中没有任何方法可以为像您这样的分页用例从队列中批量获取消息。

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

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

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

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