JMS 工作流 - 混合队列和主题
Posted
技术标签:
【中文标题】JMS 工作流 - 混合队列和主题【英文标题】:JMS Workflow - mixing Queues and Topics 【发布时间】:2012-11-14 13:55:45 【问题描述】:我有一个关于应该如何使用 JMS 的问题。这是我的情况:
我有一个有多个消费者的队列 一条消息被发送到队列 - f.e. “登录”消息 其中一个消费者处理消息现在我想告诉我所有的系统有关“登录”消息 - 即用户成功登录。我目前正在做的是:
处理消息的消费者向每个人都在收听的主题发送消息,告诉他们“用户 x 已成功登录”。我们称之为成功。现在,由于 SUCCESS 消息,每个相关系统都知道“用户 x 已成功登录”。这就是我想要的。
但是,如果我正确理解了 JMS 消息传递规则,那么理论上有可能发送到另一个主题/队列的消息依赖于接收消费者知道“用户 x 登录”可能在我的 SUCCESS 消息到达之前到达已收到。即使它是在成功消息的 session.send() 调用之后发送的。对吗?
如果是这样,您应该如何使用 JMS 实现这种情况?
任何帮助将不胜感激!
【问题讨论】:
【参考方案1】:是吗?
很遗憾,是的。
如果是这样,您应该如何使用 JMS 实现这种情况?
我想到了两种不同的方法:
模拟其他网络协议 - 添加每个系统在收到 SUCCESS 消息时必须发送的 ACKNOWLEDGE 消息。 ACKNOWLEDGE 消息将被发送到某个专用主题,并且依赖于接收消费者知道用户 x 已登录这一事实的消息在 ACKNOWLEDGE 消息从该消费者到达之前无法发送。
在同一主题上同时发送 SUCCESS 和其他消息(如果适用;如果其他消息不是最终目的地,则其他消费者可以忽略其他消息),并给予 SUCCESS 消息更高的优先级。那应该(至少在理论上——JMS API 不需要这个!)保证 SUCCESS 消息在消息之前到达,这些消息依赖于接收消费者知道用户 x 登录的事实。在这种情况下,您应该感兴趣的方法是 @ 987654321@
【讨论】:
非常感谢您的回答。我害怕那个。 不客气!恕我直言,第一个选项实施起来并不难,它将保证您在意识到用户已登录之前,不会有任何消费者收到进一步的消息。第二种选择风险更大,例如旧版本的 OpenMQ 不关心setJMSPriority
。以上是关于JMS 工作流 - 混合队列和主题的主要内容,如果未能解决你的问题,请参考以下文章