从JMS队列中获取java批处理
我需要实施以下工作流程:
- 每N毫秒从JMS队列获取所有可用消息,但不超过K个项
- 做一些处理
- 处理完成后,确认所有这些问题
我对如何使用JMS正确实现步骤1感兴趣
我尝试的是:
- 创建一个^{
} 大小的K - 在我的JMS的
onMessage
方法中MessageListener
将消息放入BlockingQueue
李> - 每隔N毫秒,将
BlockingQueue
耗尽,处理消息并确认它们李>
乍一看很好,但问题是,如果在批处理过程中在onMessage
中提取了一些消息,那么一旦批处理完成,当它在BlockingQueue
中且尚未处理时(reference),它也将被确认。所以,如果我的应用程序宕机,消息将根本不会被处理
实施步骤1的更好方法是什么?它是JMS API中的某种东西还是某种标准方法
# 1 楼答案
JMS不支持“批量抓取”必须一次提取/接收一条消息。但是,可以使用事务会话将多个消息的工作批处理在一起
此外,通过使用
MessageListener
实现,您将放弃对应用程序何时接收消息的控制,因为每当消息放入队列时,onMessage
方法将被调用我建议您完全消除} ,直到它返回}
MessageListener
。相反,每N秒使用一个事务处理的javax.jms.Session
并调用^{null
(这意味着队列为空)或您有K条消息。然后,您可以处理所有这些消息,并在提交事务会话并确认所有消息时调用^{请记住,批量越大,重复工作的可能性就越大。例如,如果您在发生某种类型的故障(阻止您提交事务性会话)之前收到K条消息并处理K-1条消息,那么这些消息将被取消返回队列,并可能在以后重新传递和处理