【问题标题】:JMS Workflow - mixing Queues and TopicsJMS 工作流 - 混合队列和主题
【发布时间】:2012-11-14 13:55:45
【问题描述】:

我有一个关于应该如何使用 JMS 的问题。这是我的情况:

  • 我有一个有多个消费者的队列
  • 一条消息被发送到队列 - f.e. “登录”消息
  • 其中一个消费者处理消息

现在我想告诉我所有的系统有关“登录”消息 - 即用户成功登录。我目前正在做的是:

  • 处理消息的消费者向每个人都在收听的主题发送消息,告诉他们“用户 x 已成功登录”。我们称之为成功。

现在,由于 SUCCESS 消息,每个相关系统都知道“用户 x 已成功登录”。这就是我想要的。

但是,如果我正确理解了 JMS 消息传递规则,那么理论上有可能发送到另一个主题/队列的消息依赖于接收消费者知道“用户 x 登录”可能在我的 SUCCESS 消息到达之前到达已收到。即使它是在成功消息的 session.send() 调用之后发送的。对吗?

如果是这样,您应该如何使用 JMS 实现这种情况?

任何帮助将不胜感激!

【问题讨论】:

    标签: jms activemq


    【解决方案1】:

    是吗?

    很遗憾,是的。

    如果是这样,您应该如何使用 JMS 实现这种情况?

    我想到了两种不同的方法:

    • 模拟其他网络协议 - 添加每个系统在收到 SUCCESS 消息时必须发送的 ACKNOWLEDGE 消息。 ACKNOWLEDGE 消息将被发送到某个专用主题,并且依赖于接收消费者知道用户 x 已登录这一事实的消息在 ACKNOWLEDGE 消息从该消费者到达之前无法发送。

    • 在同一主题上同时发送 SUCCESS 和其他消息(如果适用;如果其他消息不是最终目的地,则其他消费者可以忽略其他消息),并给予 SUCCESS 消息更高的优先级。那应该(至少在理论上——JMS API 不需要这个!)保证 SUCCESS 消息在消息之前到达,这些消息依赖于接收消费者知道用户 x 登录的事实。在这种情况下,您应该感兴趣的方法是 @ 987654321@

    【讨论】:

    • 非常感谢您的回答。我害怕那个。
    • 不客气!恕我直言,第一个选项实施起来并不难,它将保证您在意识到用户已登录之前,不会有任何消费者收到进一步的消息。第二种选择风险更大,例如旧版本的 OpenMQ 不关心setJMSPriority
    猜你喜欢
    • 2011-07-31
    • 2012-12-15
    • 1970-01-01
    • 2018-03-30
    • 2013-06-30
    • 2013-01-27
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多