【问题标题】:Make sure the broker holds messages until at least one consumer gets it确保代理持有消息,直到至少一个消费者得到它
【发布时间】:2013-10-01 18:50:54
【问题描述】:

我开始实现一个基于 ActiveMQ 的消息服务来将工作任务发送到各种服务器,但是我注意到在默认模式下,如果没有人“监听”生产者的主题,那么来自该生产者的任何消息都会被丢了。

即,

  • 如果生产者向实时代理发送消息
  • 但是没有消费者可以听
  • 消息无处可去

我希望代理保留消息直到至少有一个侦听器收到它。

我正在尝试几种实现方式,但不确定最佳/正确的方式:

  • 实现消息确认功能
  • (需要注意的是,我需要生产者在每条消息之后等待其侦听器,这看起来非常非常笨拙,是最后的手段......)
  • 实现会话事务
  • (我在这个问题上遇到了麻烦,因为交易这个词,这听起来像是在这里使用的正确东西,但我认为它更多地与生产者-经纪人互动有关,而不是生产者-消费者)李>

理想情况下,有一种发送(或一组)消息的模式,发送后返回布尔值,说明消息是否被至少一个消费者收听。

【问题讨论】:

    标签: java apache jms activemq messagebroker


    【解决方案1】:

    事务和确认在某种程度上与 JMS 主题的一般概念相冲突。

    只需使用队列而不是主题。使用CLIENT_ACKNOWLEDGE 或事务会话访问此队列。无论如何,一个工作任务只能由一个工作人员处理,因此队列解决了另一个问题。


    如果有使用主题的特殊原因,您可以考虑在与 JMS 提供程序相同的主机上使用消息驱动 bean (MDB)(例如,您可以通过使用 JBoss 及其集成的 HornetQ 来实现),但这是仍然不是很正确。

    另一种可能性是同时拥有一个主题和一个队列。后者仅用于保证每条消息的传递。

    【讨论】:

      【解决方案2】:

      这并不是典型的消息传递模式。通常,您有一个接收器和一个持久队列或多个具有持久订阅主题的接收器。在任何一种情况下,每个接收者都会始终收到消息。我真的不明白“至少一个”接收者应该接收它的用例。

      是的,事务只处理客户端和代理之间的交互,而不是客户端和最终接收者之间的交互。

      【讨论】:

      • 必须有一个消息确认协议适用于生产者到消费者。我知道这不是一个典型的模式,但必须有它发挥作用的情况......嗯
      • @EricS - 正如我所说,如果您使用事务和持久队列,那么就没有问题(或对主题的持久订阅)。在任何一种情况下,所有接收者都会总是收到消息。
      猜你喜欢
      • 2021-05-01
      • 1970-01-01
      • 2017-12-14
      • 2019-05-08
      • 2023-04-11
      • 2022-09-25
      • 2022-08-13
      • 2011-06-04
      • 1970-01-01
      相关资源
      最近更新 更多