ActiveMQ Artemis:能否通过ActiveMQServer对象访问管理API(非JMX方式)
直接通过ActiveMQServer访问管理API(嵌入式代理场景)
完全可以直接通过ActiveMQServer实例访问QueueControl、AddressControl、DivertControl等管理API,无需依赖JMX,这种方式在嵌入式代理场景下非常实用,以下是针对你需求的具体实现方案:
获取队列信息与消息计数器统计
通过ActiveMQServer的getManagementService()方法获取管理服务实例,再通过它直接拿到目标队列的QueueControl对象:
// 假设已初始化并启动ActiveMQServer实例server ManagementService managementService = server.getManagementService(); // 获取代理中所有队列的名称集合 Set<String> queueNames = managementService.getQueueNames(); for (String queueName : queueNames) { // 获取指定队列的QueueControl QueueControl queueControl = managementService.getResource(queueName, QueueControl.class); // 获取队列基础信息 System.out.println("队列名称: " + queueControl.getName()); System.out.println("当前待处理消息数: " + queueControl.getMessageCount()); // 获取Message Counters的详细统计数据 Map<String, Object> messageCounters = queueControl.getMessageCounter(); System.out.println("累计消费消息数: " + messageCounters.get("count")); System.out.println("实时消费速率: " + messageCounters.get("messageRate")); }
动态销毁队列
通过QueueControl或AddressControl都可以实现队列销毁,根据场景选择:
// 方式1:直接通过QueueControl销毁指定队列 QueueControl targetQueueControl = managementService.getResource("target-queue", QueueControl.class); targetQueueControl.destroy(); // 方式2:通过AddressControl销毁地址下的指定队列(适合关联地址管理的场景) AddressControl addressControl = managementService.getResource("target-address", AddressControl.class); addressControl.removeQueue("target-queue");
AddressControl、DivertControl的访问方式
访问逻辑和QueueControl完全一致,通过managementService.getResource()传入对应资源名称和控制类即可:
AddressControl:传入地址名称,可实现地址级别的管理操作(如创建队列、配置路由规则)DivertControl:传入分流器名称,可管理分流规则的启用、禁用或修改
注意:嵌入式代理默认启用管理服务,若需手动配置,可在初始化Configuration时设置managementEnabled=true。
内容的提问来源于stack exchange,提问作者TdBm
相关产品推荐
相关产品推荐

