Activemq 中一个主题的多个侦听器如何工作?

Posted

技术标签:

【中文标题】Activemq 中一个主题的多个侦听器如何工作?【英文标题】:How multiple listeners for a Topic work in Activemq? 【发布时间】:2018-04-01 04:02:09 【问题描述】:

我正在使用 ActiveMq 嵌入式代理。我正在使用发布/订阅模型。我有多个听众订阅了该主题。我正在使用默认消息侦听器容器。

所以我开始获取主题和订阅者的统计信息。

Topic 中的消息数统计始终为零

    DestinationStatistics statistics = destination
                        .getDestinationStatistics();
    LOG.info("The message count in topic is" + destination.getMessages().count())

据我所见,“主题中的消息数”始终为零。 所以现在我得到了目的地消费者的统计数据。目的地是我正在使用的主题。

    Iterator<Subscription> it = destination.getConsumers().iterator();
    while(it.hasNext())
    Subscription s= it.next();
    LOG.info(s.getPendingQueueSize()+ ""+ s.getEnqueueCounter()+""+s.getDequeueCounter())
    

我看到每个消费者的这些统计信息反映了我作为 pub/sub 的一部分发送的消息。

那么整个过程是如何进行的呢?

我发布一条消息,broker 立即将消息推送给订阅者,订阅者维护各自消费者的消息。 因此,主题中的消息计数始终为零,并且每个消费者的统计信息都可以了解代理接收到的消息。

有人能解释一下这个过程以及统计数据应该如何工作吗?

【问题讨论】:

你的主题是自动确认的吗?如果是这样,那么它将立即将所有消息发送给消费者。如果您的主题是持久的并且您的消费者没有运行,那么您应该会看到有关该主题的消息。 【参考方案1】:

主题只是一个地址。它不能保存消息,只能向订阅者发送消息。因此,它没有消息计数。

订阅者可以将消息保留一段时间,直到被消费者消费。

您可以使用 ActiveMQ Web 控制台或通过 JMX/Jolokia API 查看有关入队消息数量以及等待分派的消息数量的统计信息。

【讨论】:

以上是关于Activemq 中一个主题的多个侦听器如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

ActiveMQ / JMS 消息处理程序测试

如何使用虚拟目的地创建多个 activemq 主题订阅者实例?

Spring Integration JMS 创建 ActiveMQ 队列而不是主题

ActiveMQ 分布式事务+伸缩

ActiveMQ之队列和主题发布订阅实例

负载均衡 MessageQ (ActiveMQ)