gpt4 book ai didi

jms - 获取第一条消息到达 2 个队列中的一个

转载 作者:行者123 更新时间:2023-12-05 00:03:26 25 4
gpt4 key购买 nike

我有一个应用程序,我想使用来自队列 A 的消息,但如果队列 A 为空,我希望它使用来自队列 B 的消息而不是闲置。我只希望它一次处理一条消息,如果消费者正忙于处理一条消息(来自任一队列),则其他未决消息(在任一队列上)应保留在其队列中,直到消费者再次空闲(这给出了其他消费者有机会处理新消息)。

因此,例如,如果消息在消费者空闲(等待)时到达队列 A 或队列 B,则消费者将拾取它。如果消息在消费者当前正在处理消息时到达任一队列,则在消费者完成当前消息处理之前不会发生任何事情。如果一条消息在队列 A 和队列 B 上都可用,则消费者更愿意从队列 A 中挑选消息。

编辑:实际上我同样很高兴得知消息可以在 A 和 B 上使用,并实现我自己的逻辑来选择我真正想从排队。

在单独的线程中同时订阅两个队列似乎不起作用,因为:

  • 如果消息 M 到达队列 A,消费者将不得不在处理消息 M 时取消订阅队列 B,然后重新订阅一次消息 M 被处理。否则,如果消息到达队列 B,它可能会被同时接收和发送 - 我不想一次处理多个消息。
  • 如果一条消息同时到达两个队列(或者当消费者启动或完成处理前一条消息时,一条消息已经在两个队列上可用),则有可能在消费者收到有机会取消订阅队列 B。如果发生这种情况,我将不得不回滚其中一条消息,但如果这种情况经常发生,则该消息将超过回滚计数并移至失败队列。

理想情况下,我想将其概括为 N 个队列的情况。我对理想地通过 JMS 工作的解决方案很感兴趣,但如果我必须使用 IBM MQ 特定的 API 来执行此操作,那也没关系。是否有有助于实现这一目标的使用模式或库?是否有允许它的替代排队方法/技术/技术?

从所有队列中取出所有消息并将它们放入单个队列是不行的;我们需要能够独立地清除各个队列,不同的消费者可能订阅 N 个队列的不同子集。

最佳答案

我不知道这对您的代码是否会有很大的改变,但是您是否考虑过在您的项目中添加 Spring Framework 尤其是 Spring Integration?你描述的这些问题已经在那里处理了。

这个问题可以通过在两个队列和一个线程池上使用事件驱动消费者的两个端点来解决。

http://www.eaipatterns.com/EventDrivenConsumer.html

http://en.wikipedia.org/wiki/Thread_pool_pattern

[编辑]

如果你希望消息在线程被释放之前一直留在队列中,你可以遵循轮询消费者的模式

http://www.eaipatterns.com/PollingConsumer.html

可以随意选择先从哪个队列请求消息。请记住,使用此技术,如果您的系统处理消息的速度快于消息到达的速度,您将遇到一些对队列的冗余轮询。

关于jms - 获取第一条消息到达 2 个队列中的一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25769559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com