退出onMessage()后jms调用message.acknowledge()

时间:2013-04-16 05:26:27

标签: java concurrency jms

我想同时使用来自多个队列的jms消息。在长时间运行处理后,所有消息都应该发送到数据库,我无权丢失它们。

问题:是否可以保存邮件以供将来确认,并在处理其他邮件时致电oldMessage.acknowledge()

我的第一个猜测是,这是不可能的,因为它在jms处理单元深处,我必须在onMessage(...)方法中处理消息和确认。

第二个猜测是同时拆分onMessage()并允许对许多消息进行长时间运行处理。但这不是一个好的选择,因为我必须确保所有消息都来有序
第二个问题:在并发处理时有没有办法确保传入的订单?

1 个答案:

答案 0 :(得分:0)

1: JMS在 Session 上有一个标志,即* CLIENT_ACKNOWLEDGE *,您可以看到它here。我从未使用它,但似乎做你想做的事。

<强> 2

2.1:您有相同队列的N个消费者:您可以探索某些实现支持的独占消费者。 (对于AtiveMQ:here)。

2.2 每个队列有1个消费者,但您想要从所有队列中订购所有消息。 您可以使用有序SlackBuffer的概念。

您可以探索另一种可能性:将所有消息重定向到维护消息顺序的输出队列,您将只使用来自该单个输出队列的消息。消息的顺序和重定向由MQ服务器完成。如果您可以控制MQ服务器,那只是一个有效的想法。

我希望这可以提供帮助