【问题标题】:Number of subscribed and unsent topic messages in ActiveMQActiveMQ 中已订阅和未发送的主题消息数
【发布时间】:2016-07-21 13:01:04
【问题描述】:

我已经使用 ActiveMQ 作为消息代理设置了一个简单的聊天应用程序。聊天是双方可以发布消息并订阅消息的主题。消息包含有关消息的一些元数据,例如发送者和接收者 ID。一切正常。

现在我想找到所有等待聊天消息的用户,即他们处于离线状态,并且有一条已发布的消息等待阅读他们的主题。这些用户应该使用另一个平台(通过他们的手机)收到关于有新消息要阅读的通知。

已搜索所有 ActiveMQ 文档和论坛以寻找答案,但找不到任何东西(可能不明白)。这似乎是一个需要 MQ 处理的明显查询......

我为代理启用了 JMX 并找到了 EnqueueCount/DequeueCount,但这并没有多大帮助,因为它们计算了发送的消息总数(针对每个订阅者)。

【问题讨论】:

    标签: activemq


    【解决方案1】:

    研究持久订阅。这将为每个用户创建一个订阅,其中代理会跟踪哪个消费者收到了哪些消息并支持“暂时离开”问题。

    加分:改用虚拟主题。它是发布到主题 -> 从队列语义订阅。更灵活,更易于维护。

    注意:针对配置示例进行了编辑

    <broker...>
     .... <!-- be sure to place elements after "<broker>" in alphabetical order -->
     <destinationInterceptors>
          <virtualDestinationInterceptor>
              <virtualDestinations>
                 <virtualTopic name=">" prefix="VirtualTopicConsumers.*." selectorAware="false"/>
             </virtualDestinations>
         </virtualDestinationInterceptor>
     </destinationInterceptors>
     ...
    </broker>
    

    然后将您的生产者设置为:

    1. 生产者目的地:topic://My.Topic
    2. 订阅 1 目标名称:queue://VirtualTopicConsumers.Sub1.My.Topic
    3. 订阅 1 目标名称:queue://VirtualTopicConsumers.Sub2.My.Topic

    【讨论】:

    • 感谢您的回答。不要完全遵循持久订阅的想法。常规主题非常适合解决发送者和接收者之间的时间差异。虚拟主题似乎适合从多个线程中消费,但我如何获取有关主题剩余消息的信息?
    • 持久订阅维护等待消费的消息数量的度量。此外,在 VirtualTopic 方法中使用队列允许您使用队列统计信息来指示每个订阅者需要使用的剩余消息
    • 很抱歉我最初对持久订阅的困惑,这就是我已经在使用的。您的 virtual-topic-queue-idea 可能有效,但仅通过阅读 ActiveMQ 文档,我无法理解它。 Petter Nordlander 建议的咨询消息方法对我来说更容易。
    • karp47:查看我的更新答案 w/config sn-p 和示例目的地名称
    【解决方案2】:

    您可以做些什么来了解哪些消息已发布以及哪些消息已被消费(和未消费)您可以收听advisory messages

    从您的“管理应用”订阅ActiveMQ.Advisory.MessageDelivered.Topic 以了解已发送的消息。

    然后订阅ActiveMQ.Advisory.MessageConsumed.Topic,了解消费了哪些消息。

    然后,您可能需要做一些工作,才能确定是否有消息在某个时间范围内没有被消费,并且需要采取一些措施(通过其他方式通知用户)。

    您需要在配置中启用此功能。

    <destinationPolicy>
       <policyMap><policyEntries> 
          <policyEntry topic=">" advisoryForConsumed="true" />
       </policyEntries></policyMap>
    </destinationPolicy>
    

    【讨论】:

    • 谢谢,这可能行得通。我将不得不仔细查看建议消息的内容...稍后会报告。
    • 这是我的报告...我遇到了一个新问题。我使用 MQTT 作为传输协议,结果证明它不适用于咨询消息(至少从我对 ActiveMQ 的理解来看,我的所有测试也都失败了)。我最终重新设计了应用程序并添加了一些额外的主题,我在其中发布了有关消息的元数据。我猜这类似于咨询消息的工作方式。
    • 我已将此标记为我的答案,因为这个想法引导我找到了一个可行的解决方案。但是,也请阅读 Matt Pavlovich 的回答,因为这可能对您有用。
    猜你喜欢
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 2017-01-28
    • 2014-07-03
    • 2019-09-09
    • 1970-01-01
    • 2021-04-14
    相关资源
    最近更新 更多