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 工作流 - 混合队列和主题的主要内容,如果未能解决你的问题,请参考以下文章

从 mule 中的队列/主题中读取消息

JMS 主题订阅 Tomee 1.7.1

activeMQ队列模式和主题模式的Java实现

JMS 主题与队列 - 意图

Spring Integration JMS 创建 ActiveMQ 队列而不是主题

是否可以在运行时手动将消息驱动 bean 订阅到 JMS 队列/主题?