如何通过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
相关产品推荐
相关产品推荐

