MessageListener
接口仅定义接收单个onMessage
作为参数的方法Message
。我正在寻找一种从队列中获取多个Message
的方法,以便我可以处理批处理,然后确认批处理中的所有Message
。
JMS世界中有这样的功能吗?如果不是,ActiveMQ是否支持它作为扩展名?
谢谢,Mickael
答案 0 :(得分:3)
JMS 1.1 spec部分 4.5.1同步传递中解释了这一点:
客户端可以使用一个消息从MessageConsumer请求下一条消息 它的接收方法。接收有几种变体 允许客户端轮询或等待下一条消息。
部分 9.2.2同步接收消息中甚至有一个代码示例:
TextMessage stockMessage;
stockMessage = (TextMessage)receiver.receive();
请注意,在使用轮询和批处理时,您还应该了解确认 - 有关详细信息,请参阅 4.4.11消息确认部分。特别有趣的可能是:
CLIENT_ACKNOWLEDGE - 使用此选项,客户端会确认一条消息 通过调用消息的确认方法。承认消耗了 消息自动确认收到所有消息 已经通过其会议提供。
答案 1 :(得分:2)
是的,这是常规JMS API的一部分。而不是在MessageListener
中消费,而是使用MessageConsumer.receive()
在循环中进行消费。要对其进行事务批处理,您需要使用SESSION_TRANSACTED
确认模式,并在要发送批量确认时调用Session.commit()
。
查看Apache Camel中sjms-batch组件的源代码,了解如何完成此操作。