【发布时间】:2014-09-10 15:37:27
【问题描述】:
我有一个应用程序,我想使用队列 A 中的消息,但如果队列 A 为空,我希望它使用队列 B 中的消息,而不是闲置。我只希望它一次处理 1 条消息,如果消费者正忙于处理一条消息(来自任一队列),则其他待处理消息(在任一队列上)应保留在其队列中,直到消费者再次空闲(这给出其他消费者有机会处理新消息)。
因此,例如,如果消息在消费者空闲(等待)时到达队列 A 或队列 B,则消费者会拾取它。如果在消费者当前正在处理消息时消息到达任一队列,则在消费者完成当前消息处理之前不会发生任何事情。如果消息在队列 A 和队列 B 上都可用,则消费者更愿意从队列 A 中选择消息。
编辑:实际上,我同样很高兴得知消息可以在 A 和 B 上使用,并实现我自己的逻辑来选择我真正想要从排队。
在不同的线程中同时订阅两个队列似乎不起作用,因为:
- 如果消息 M 到达队列 A,消费者在处理消息 M 时必须取消订阅队列 B,然后重新订阅一次消息 M 被处理。除此以外, 如果一条消息到达队列 B,它可能会同时被拾取和发送 - 我不想一次处理多个消息。
- 如果一条消息同时到达两个队列(或者当消费者启动或完成对前一条消息的处理时两个队列上已经有一条消息),那么有可能两条消息都将在消费者获得取消订阅队列 B 的机会。如果发生这种情况,我必须回滚其中一条消息,但如果这种情况频繁发生,消息将超过回滚计数并被移至失败队列。
理想情况下,我想将其推广到 N 个队列的情况。我对理想地通过 JMS 工作的解决方案感兴趣,但如果我必须使用 IBM MQ 特定的 API 来执行此操作,那也没关系。是否有有助于实现这一目标的使用模式或库?是否有其他排队方法/技术/技术允许它?
从所有队列中拉出所有消息并将它们放入单个队列是不行的;我们需要能够独立清除各个队列,并且不同的消费者可以订阅 N 个队列的不同子集。
【问题讨论】: