如何获取ActiveMQ Classic指定目的地的定时消息数量?
获取ActiveMQ Classic指定队列的定时消息数量
要获取指定队列的定时消息数量,需要针对目标队列对应的JobScheduler MBean进行统计,而非使用全局JobScheduler或DestinationViewMBean,具体实现如下:
核心思路
通过AMQ_SCHEDULED_DELAY头设置的定时消息,会被存储在对应队列专属的JobScheduler中,该组件对应的MBean为JobSchedulerViewMBean,调用其getDelayedMessageCount()方法即可直接获取该队列的定时消息数。
实现代码
构造目标队列专属JobScheduler的ObjectName,再获取MBean代理并调用统计方法:
import org.apache.activemq.broker.jmx.JobSchedulerViewMBean; import javax.management.MalformedObjectNameException; import javax.management.ObjectName; private JobSchedulerViewMBean getQueueJobSchedulerMBean(String queueName) throws MalformedObjectNameException { // 替换占位符为实际Broker名称,构造队列专属JobScheduler的ObjectName ObjectName schedulerObjectName = new ObjectName( "org.apache.activemq:type=Broker,brokerName=" + broker.getBrokerName() + ",destinationType=Queue,destinationName=" + queueName + ",service=JobScheduler" ); return (JobSchedulerViewMBean) broker.getManagementContext() .newProxyInstance(schedulerObjectName, JobSchedulerViewMBean.class, true); } // 使用示例 JobSchedulerViewMBean queueScheduler = getQueueJobSchedulerMBean("your-target-queue"); long scheduledCount = queueScheduler.getDelayedMessageCount(); System.out.println("------> 队列定时消息数: " + scheduledCount);
原方法无效原因说明
- DestinationViewMBean:仅统计队列常规消息指标(如队列长度、入队数等),不包含定时消息的单独统计项。
- BrokerViewMBean获取ScheduledMessageCount:队列MBean中不存在
ScheduledMessageCount属性,因此会抛出AttributeNotFoundException。 - 全局JobSchedulerViewMBean:其
getDelayedMessageCount()统计的是Broker所有队列的定时消息总数,无法按单个队列筛选。
内容的提问来源于stack exchange,提问作者skin27
相关产品推荐
相关产品推荐

