You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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);

原方法无效原因说明

  1. DestinationViewMBean:仅统计队列常规消息指标(如队列长度、入队数等),不包含定时消息的单独统计项。
  2. BrokerViewMBean获取ScheduledMessageCount:队列MBean中不存在ScheduledMessageCount属性,因此会抛出AttributeNotFoundException。
  3. 全局JobSchedulerViewMBean:其getDelayedMessageCount()统计的是Broker所有队列的定时消息总数,无法按单个队列筛选。

内容的提问来源于stack exchange,提问作者skin27

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 20:37:11