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>
然后将您的制作人设置为:
- 生产者目的地:topic://My.Topic
- 订阅 1 目的地名称:queue://VirtualTopicConsumers.Sub1.My.Topic
- 订阅 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>
我设置了一个简单的聊天应用程序,使用 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>
然后将您的制作人设置为:
- 生产者目的地:topic://My.Topic
- 订阅 1 目的地名称:queue://VirtualTopicConsumers.Sub1.My.Topic
- 订阅 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>