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

如何通过JMX从ActiveMQ获取消费者列表及消费者Selector?

获取ActiveMQ队列的消费者列表及Selector信息

我来帮你解决这个问题!你现有的代码已经能获取队列名称和消费者数量了,要拿到具体的消费者列表以及每个消费者的selector,只需要借助ActiveMQ提供的ConsumerViewMBean这个JMX MBean接口就可以实现,下面是调整后的完整代码:

package controller;

import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import org.apache.activemq.broker.jmx.BrokerViewMBean;
import org.apache.activemq.broker.jmx.QueueViewMBean;
import org.apache.activemq.broker.jmx.ConsumerViewMBean;

public class Monitor {
    public static void main(String[] args) throws Exception {
        String url = "service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi";
        JMXServiceURL urls = new JMXServiceURL(url);
        JMXConnector connector = JMXConnectorFactory.connect(urls);
        connector.connect();
        MBeanServerConnection mbsc = connector.getMBeanServerConnection();

        ObjectName objectName = new ObjectName("org.apache.activemq:brokerName=localhost,type=Broker");
        BrokerViewMBean mBean = MBeanServerInvocationHandler.newProxyInstance(mbsc, objectName, BrokerViewMBean.class, true);

        for (ObjectName queueName : mBean.getQueues()) {
            QueueViewMBean queueMBean = MBeanServerInvocationHandler.newProxyInstance(mbsc, queueName, QueueViewMBean.class, true);
            
            // 队列名称
            System.out.println("\n=== Queue Name: " + queueMBean.getName() + " ===");
            // 消费者数量
            System.out.println("Number of Consumers: " + queueMBean.getConsumerCount());

            // 获取该队列下的所有消费者ObjectName列表
            ObjectName[] consumerObjectNames = queueMBean.getConsumers();
            if (consumerObjectNames != null && consumerObjectNames.length > 0) {
                System.out.println("--- Consumer List ---");
                for (ObjectName consumerName : consumerObjectNames) {
                    // 创建ConsumerViewMBean代理
                    ConsumerViewMBean consumerMBean = MBeanServerInvocationHandler.newProxyInstance(
                            mbsc, consumerName, ConsumerViewMBean.class, true);
                    
                    // 消费者ID
                    System.out.println("Consumer ID: " + consumerMBean.getConsumerId());
                    // 获取消费者的selector(就是你截图里的内容)
                    String selector = consumerMBean.getSelector();
                    System.out.println("Consumer Selector: " + (selector == null || selector.isEmpty() ? "No selector set" : selector));
                    // 还可以获取其他消费者信息,比如客户端ID、连接ID等
                    System.out.println("Client ID: " + consumerMBean.getClientId());
                }
            } else {
                System.out.println("No consumers connected to this queue.");
            }
        }
        // 记得关闭连接
        connector.close();
    }
}

关键步骤说明:

  • 导入ConsumerViewMBean:这个接口封装了消费者的所有JMX可查询属性,包括你需要的selector。
  • 获取消费者列表:通过QueueViewMBean.getConsumers()方法拿到当前队列下所有消费者的ObjectName数组。
  • 获取Selector:将每个消费者的ObjectName转换成ConsumerViewMBean代理后,调用getSelector()方法就能直接获取到该消费者设置的消息选择器。如果返回空字符串或null,说明这个消费者没有配置selector。

这样你就能拿到截图里显示的消费者selector信息了,同时也能获取到每个消费者的详细列表~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:15:22