如何获取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来实现,步骤和代码示例如下:
步骤说明
- 确保你的Java客户端依赖版本和Broker版本(2.4.0)一致,避免兼容性问题;
- 创建到Broker的管理会话连接;
- 获取目标队列的
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
相关产品推荐
相关产品推荐

