ActiveMQ 中已订阅和未发送的主题消息数

Number of subscribed and unsent topic messages in ActiveMQ

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

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

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

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

研究持久订阅。这将为每个用户创建一个订阅,其中代理跟踪哪个消费者收到了哪些消息并支持 "go away for a while" 问题。

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

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

<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

您可以执行哪些操作来查明哪些消息已发布以及哪些消息已被消费(和未消费)您可以收听advisory messages

从您的 "management-app" 订阅 ActiveMQ.Advisory.MessageDelivered.Topic 以了解已发送的消息。

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

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

您需要在您的配置中启用它。

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