java - 分页 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;
解决方案
对于像您这样的分页用例,JMS API 中没有用于批量从队列中获取消息的方法。
您可以将队列浏览器中的所有消息读入您自己的数据结构并使用它进行分页。
如果有太多消息无法一次将它们全部放入内存数据结构中,那么您可以尽可能多地读取它们可以合理地放入内存(这可能会比用户在任何给定页面上看到的更多)这将作为您自己的应用程序级页面,您可以使用它来提供用户级页面。这将减少您需要循环浏览队列浏览器的次数。
除此之外,您可以将队列浏览器中的所有消息转储到一个临时的随机访问文件中,然后从中提取结果。
综上所述,我认为您的用例最终不适合像 JMS 这样的消息传递 API。在我看来,我认为您更适合使用可以轻松支持此用例的数据库之类的东西。
推荐阅读
- php - 我如何在不写所有路径的情况下 chdir()
- azure - Azure v2.0 Refresh Token,返回另一个 Refresh Token
- php - 高级自定义字段 | 在转发器中发布对象不起作用
- elm - 检查字典中的值
- r - 选择不包含特定模式 R 正则表达式的字符串
- ajax - 保存到数据库后如何在数据表中显示记录?
- c# - 使用 xsd.exe 工具将 http://www.loc.gov/standards/mets/mets.xsd 转换为 C# 类不起作用
- c++ - 复制构造函数未在 C++ 类上删除
- angular - 当我登录时如何设置超时并离开该路线?
- java - 与旧嵌套列表相比,如何识别新嵌套列表中是否有任何添加或删除或相同的对象