有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

从JMS队列中获取java批处理

我需要实施以下工作流程:

  1. 每N毫秒从JMS队列获取所有可用消息,但不超过K个项
  2. 做一些处理
  3. 处理完成后,确认所有这些问题

我对如何使用JMS正确实现步骤1感兴趣

我尝试的是:

  1. 创建一个^{}大小的K
  2. 在我的JMS的onMessage方法中MessageListener将消息放入BlockingQueue
  3. 每隔N毫秒,将BlockingQueue耗尽,处理消息并确认它们

乍一看很好,但问题是,如果在批处理过程中在onMessage中提取了一些消息,那么一旦批处理完成,当它在BlockingQueue中且尚未处理时(reference),它也将被确认。所以,如果我的应用程序宕机,消息将根本不会被处理

实施步骤1的更好方法是什么?它是JMS API中的某种东西还是某种标准方法


共 (1) 个答案

  1. # 1 楼答案

    JMS不支持“批量抓取”必须一次提取/接收一条消息。但是,可以使用事务会话将多个消息的工作批处理在一起

    此外,通过使用MessageListener实现,您将放弃对应用程序何时接收消息的控制,因为每当消息放入队列时,onMessage方法将被调用

    我建议您完全消除MessageListener。相反,每N秒使用一个事务处理的javax.jms.Session并调用^{},直到它返回null(这意味着队列为空)或您有K条消息。然后,您可以处理所有这些消息,并在提交事务会话并确认所有消息时调用^{}

    请记住,批量越大,重复工作的可能性就越大。例如,如果您在发生某种类型的故障(阻止您提交事务性会话)之前收到K条消息并处理K-1条消息,那么这些消息将被取消返回队列,并可能在以后重新传递和处理