【问题标题】:jms call to message.acknowledge() after exiting onMessage()退出 onMessage() 后 jms 调用 message.acknowledge()
【发布时间】:2013-04-16 14:22:49
【问题描述】:

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

问题:是否可以保存消息以供将来确认并在处理另一条消息时调用oldMessage.acknowledge()

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

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

【问题讨论】:

  • 所以你有例如 2 个队列,在第一个队列中你得到消息 A 和 B,在第二个队列中你得到消息 C 和 D?现在至少有两个线程在读取它们。他们也做了很多工作并将它们存储在数据库中,对吗?那么当它们插入数据库时​​,您想保留相同的顺序吗?
  • 为了使处理并发我的意思是对每个输入队列进行并发处理,例如here,所以我认为如果我有消息A和B的队列,那么我想确保它们来到订购的数据库

标签: java concurrency jms


【解决方案1】:

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

2:

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

2.2 每个队列有 1 个消费者,但您想对所有队列中的所有消息进行排序。 您可以使用有序 SlackBuffer 的概念。

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

希望对你有帮助

【讨论】:

  • 关于独占消费者:“代理将选择单个 MessageConsumer 来获取队列的所有消息以确保排序”。一个单。这已经不是从队列中并发读取了
  • JavaDoc 写成:A client may individually acknowledge each message as it is consumed, or it may choose to acknowledge messages as an application-defined group (which is done by calling acknowledge on the last received message of the group, thereby acknowledging all messages consumed by the session.) 这是否意味着如果我在任何消息上调用acknowledge(),我将得到所有消费消息的确认?
  • Anatoly,如果您使用消息组,这将被应用。这是一些经纪人的一个很好的特点。我也让你herethis 的ActiveMQ 示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 2011-02-05
相关资源
最近更新 更多