【问题标题】:Paginating JMS Queue分页 JMS 队列
【发布时间】:2019-06-21 18:36:29
【问题描述】:

在我的 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;

【问题讨论】:

    标签: java jboss jms hornetq


    【解决方案1】:

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

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

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

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

    话虽如此,我认为您的用例最终不适合 JMS 之类的消息传递 API。在我看来,我认为您更适合使用可以轻松支持此用例的数据库之类的东西。

    【讨论】:

    • 不适合读取队列中的所有消息,因为我有数千条大消息,最终会出现 OutOfMemory 问题。
    • 是否可以从队列中获取特定消息之后的消息? (例如最后一页的最后一条消息)
    • JMS 不支持这种功能。我已经用一些额外的想法更新了我的答案。
    猜你喜欢
    • 2018-01-14
    • 1970-01-01
    • 2011-06-15
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 2011-10-02
    • 2010-12-26
    相关资源
    最近更新 更多