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

如何获取ActiveMQ Artemis队列大小(深度)及远程Broker的Java API实现

刚好对ActiveMQ Artemis的队列监控比较熟悉,来给你详细解答这两个问题:

1. 如何获取ActiveMQ Artemis的队列大小(即队列深度)?

获取队列深度有几种常用方式,可根据你的使用场景选择:

  • 管理控制台:如果Broker启用了默认的管理控制台(端口通常是8161),登录后找到目标队列的详情页面,就能直接看到当前队列深度(一般会显示Current Size,也可以通过Messages Enqueued减去Messages Dequeued计算得到)。
  • Artemis CLI命令:用Broker自带的artemis命令行工具,执行以下命令就能拿到队列的统计信息,包括深度:
    ./artemis queue stat --url tcp://<broker-host>:61616 --user <your-username> --password <your-password> --name <queue-name>
    
  • JMX监控:通过JMX连接到Broker,找到对应队列的MBean(路径格式大致为org.apache.activemq.artemis:broker=<broker-name>,component=addresses,address=<address-name>,subcomponent=queues,routing-type=<routing-type>,queue=<queue-name>),调用getMessageCount()方法即可获取当前队列深度。
2. 使用Java客户端API获取远程ActiveMQ Artemis 2.4.0 Broker的队列大小

针对2.4.0版本,你可以通过Artemis的核心管理API来实现,步骤和代码示例如下:

步骤说明

  1. 确保你的Java客户端依赖版本和Broker版本(2.4.0)一致,避免兼容性问题;
  2. 创建到Broker的管理会话连接;
  3. 获取目标队列的QueueControl对象,调用其方法获取队列深度。

代码示例

import org.apache.activemq.artemis.api.core.TransportConfiguration;
import org.apache.activemq.artemis.api.core.client.ActiveMQClient;
import org.apache.activemq.artemis.api.core.client.ClientSession;
import org.apache.activemq.artemis.api.core.client.ClientSessionFactory;
import org.apache.activemq.artemis.api.core.management.QueueControl;
import org.apache.activemq.artemis.core.remoting.impl.netty.NettyConnectorFactory;

import java.util.HashMap;
import java.util.Map;

public class RemoteQueueSizeFetcher {
    public static void main(String[] args) throws Exception {
        // 配置Broker连接信息
        String brokerHost = "remote-broker-ip";
        int brokerPort = 61616;
        String username = "admin";
        String password = "admin";
        String queueName = "your-target-queue";
        String addressName = "your-target-address"; // 队列对应的地址

        // 构建传输配置
        Map<String, Object> connParams = new HashMap<>();
        connParams.put("host", brokerHost);
        connParams.put("port", brokerPort);
        TransportConfiguration transportConfig = new TransportConfiguration(NettyConnectorFactory.class.getName(), connParams);

        // 创建会话工厂和会话
        ClientSessionFactory sessionFactory = ActiveMQClient.createClientSessionFactory(transportConfig);
        // 注意会话参数:用户名、密码、是否自动确认、是否支持事务等
        ClientSession session = sessionFactory.createSession(username, password, false, true, true, false, 1);

        try {
            // 获取队列的控制对象
            QueueControl queueControl = session.createQueueControl(addressName, queueName, null);

            // 获取当前队列深度
            long queueSize = queueControl.getMessageCount();
            System.out.printf("队列 %s 的当前大小为: %d%n", queueName, queueSize);
        } finally {
            // 务必关闭资源
            session.close();
            sessionFactory.close();
        }
    }
}

额外注意事项

  • 如果你的队列使用了特定的路由类型(比如MULTICAST),需要在createQueueControl方法中补充路由类型参数;
  • 确保连接Broker的用户拥有管理权限(默认的admin用户具备该权限);
  • 如果Broker配置了SSL连接,需要在传输配置中添加对应的SSL参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:56:17