我们知道ActiveMQ broker的管理接口是通过JMX方式提供的。
一个简单的访问方式就是通过jconsole,输入
service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
需要注意的是:
1、默认JMX功能是没有打开的,需要在activemq.xml的broker配置上添加useJmx="true"
2、需要在managementContext里,修改为createConnector="true",(同时这里也可以修改jmx的端口和domain)
(参见http://activemq.apache.org/jmx.html)
通过jconsole来操作还是不太方便。特别是某些时候我们需要把对broker和queue的管理集成到我们的管理系统中去。
这时候我们就需要通过JMX的编程接口来与broker进行交互了。
可以先写一个小程序,看看broker的jmx中都提供了什么东西。
- package kk;
- import java.util.Iterator;
- import java.util.Set;
- import javax.management.MBeanAttributeInfo;
- import javax.management.MBeanInfo;
- import javax.management.MBeanOperationInfo;
- import javax.management.MBeanServerConnection;
- import javax.management.ObjectInstance;
- import javax.management.ObjectName;
- import javax.management.remote.JMXConnector;
- import javax.management.remote.JMXConnectorFactory;
- import javax.management.remote.JMXServiceURL;
- public class TestJMX {
- public static void main(String[] args) throws Exception {
- String surl = "service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi";
- JMXServiceURL url = new JMXServiceURL(surl);
- JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
- MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
- System.out.println("Domains:---------------");
- String domains[] = mbsc.getDomains();
- for (int i = 0; i < domains.length; i++) {
- System.out.println("\tDomain[" + i + "] = " + domains[i]);
- }
- System.out.println("all ObjectName:---------------");
- Set<ObjectInstance> set = mbsc.queryMBeans(null, null);
- for (Iterator<ObjectInstance> it = set.iterator(); it.hasNext();) {
- ObjectInstance oi = (ObjectInstance) it.next();
- System.out.println("\t" + oi.getObjectName());
- }
- System.out.println("org.apache.activemq:BrokerName=localhost,Type=Broker:---------------");
- ObjectName mbeanName = new ObjectName("org.apache.activemq:BrokerName=localhost,Type=Broker");
- MBeanInfo info = mbsc.getMBeanInfo(mbeanName);
- System.out.println("Class: " + info.getClassName());
- if (info.getAttributes().length > 0){
- for(MBeanAttributeInfo m : info.getAttributes())
- System.out.println("\t ==> Attriber:" + m.getName());
- }
- if (info.getOperations().length > 0){
- for(MBeanOperationInfo m : info.getOperations())
- System.out.println("\t ==> Operation:" + m.getName());
- }
- jmxc.close();
- }
- }
输出结果:
- Domains:---------------
- Domain[0] = JMImplementation
- Domain[1] = com.sun.management
- Domain[2] = java.lang
- Domain[3] = org.apache.activemq
- Domain[4] = java.util.logging
- all ObjectName:---------------
- java.lang:type=OperatingSystem
- java.lang:type=MemoryPool,name=Perm Gen
- java.lang:type=Memory
- JMImplementation:type=MBeanServerDelegate
- org.apache.activemq:BrokerName=localhost,Type=Producer,destinationType=Queue,destinationName=kk.qq,clientId=ID_bsb3-1381-1372146822218-0_1,producerId=ID_bsb3-1381-1372146822218-1_1_1_1
- org.apache.activemq:BrokerName=localhost,Type=Connection,ConnectorName=openwire,Connection=ID_bsb3-1381-1372146822218-0_1
- org.apache.activemq:BrokerName=localhost,Type=Subscription,persistentMode=Non-Durable,destinationType=Queue,destinationName=kk.qq,clientId=ID_bsb3-1381-1372146822218-0_1,consumerId=ID_bsb3-1381-1372146822218-1_1_1_1
- org.apache.activemq:BrokerName=localhost,Type=Connection,ConnectorName=openwire,ViewType=address,Name=tcp_//127.0.0.1_1347
- java.lang:type=GarbageCollector,name=MarkSweepCompact
- org.apache.activemq:BrokerName=localhost,Type=Broker
- org.apache.activemq:BrokerName=localhost,Type=Topic,Destination=ActiveMQ.Advisory.Producer.Topic.kk.dp
- org.apache.activemq:BrokerName=localhost,Type=Topic,Destination=ActiveMQ.Advisory.Topic
- java.lang:type=MemoryManager,name=CodeCacheManager
- org.apache.activemq:BrokerName=localhost,Type=Topic,Destination=ActiveMQ.Advisory.Connection
- org.apache.activemq:BrokerName=localhost,Type=Topic,Destination=ActiveMQ.Advisory.Queue
- org.apache.activemq:BrokerName=localhost,Type=Topic,Destination=ActiveMQ.Advisory.Consumer.Topic.kk.dp
- org.apache.activemq:BrokerName=localhost,Type=Connection,ConnectorName=openwire,Connection=ID_bsb3-1346-1372146798953-0_1
- java.lang:type=Compilation
- org.apache.activemq:BrokerName=localhost,Type=Connection,ConnectorName=openwire,ViewType=address,Name=tcp_//127.0.0.1_1382
- java.util.logging:type=Logging
- java.lang:type=MemoryPool,name=Tenured Gen
- org.apache.activemq:BrokerName=localhost,Type=Subscription,persistentMode=Non-Durable,destinationType=Topic,destinationName=ActiveMQ.Advisory.TempQueue_ActiveMQ.Advisory.TempTopic,clientId=ID_bsb3-1346-1372146798953-0_1,consumerId=ID_bsb3-1346-1372146798953-1_1_-1_1
- java.lang:type=MemoryPool,name=Survivor Space
- java.lang:type=Runtime
- org.apache.activemq:BrokerName=localhost,Type=Topic,Destination=ActiveMQ.Advisory.Producer.Queue.kk.qq
- java.lang:type=GarbageCollector,name=Copy
- org.apache.activemq:BrokerName=localhost,Type=Queue,Destination=kk.qq
- org.apache.activemq:BrokerName=localhost,Type=Subscription,persistentMode=Durable,subscriptionID=kk-dp-dc,destinationType=Topic,destinationName=kk.dp,clientId=kk-dp
- java.lang:type=MemoryPool,name=Eden Space
- org.apache.activemq:BrokerName=localhost,Type=Topic,Destination=ActiveMQ.Advisory.Consumer.Queue.kk.qq
- java.lang:type=Threading
- org.apache.activemq:BrokerName=localhost,Type=Topic,Destination=kk.dp
- com.sun.management:type=HotSpotDiagnostic
- java.lang:type=ClassLoading
- org.apache.activemq:BrokerName=localhost,Type=Subscription,persistentMode=Non-Durable,destinationType=Topic,destinationName=ActiveMQ.Advisory.TempQueue_ActiveMQ.Advisory.TempTopic,clientId=ID_bsb3-1381-1372146822218-0_1,consumerId=ID_bsb3-1381-1372146822218-1_1_-1_1
- java.lang:type=MemoryPool,name=Code Cache
- org.apache.activemq:BrokerName=localhost,Type=Connector,ConnectorName=openwire
- org.apache.activemq:BrokerName=localhost,Type=Broker:---------------
- Class: org.apache.activemq.broker.jmx.BrokerView
- ==> Attriber:Uptime
- ==> Attriber:BrokerVersion
- ==> Attriber:Slave
- ==> Attriber:BrokerName
- ==> Attriber:Persistent
- ==> Attriber:TransportConnectors
- ==> Attriber:BrokerId
- ==> Attriber:Topics
- ==> Attriber:Queues
- ==> Attriber:TemporaryTopics
- ==> Attriber:TemporaryQueues
- ==> Attriber:TopicSubscribers
- ==> Attriber:DurableTopicSubscribers
- ==> Attriber:QueueSubscribers
- ==> Attriber:TemporaryTopicSubscribers
- ==> Attriber:TemporaryQueueSubscribers
- ==> Attriber:InactiveDurableTopicSubscribers
- ==> Attriber:TopicProducers
- ==> Attriber:QueueProducers
- ==> Attriber:TemporaryTopicProducers
- ==> Attriber:TemporaryQueueProducers
- ==> Attriber:DynamicDestinationProducers
- ==> Attriber:TotalEnqueueCount
- ==> Attriber:TotalDequeueCount
- ==> Attriber:TotalConsumerCount
- ==> Attriber:TotalProducerCount
- ==> Attriber:TotalMessageCount
- ==> Attriber:MemoryPercentUsage
- ==> Attriber:MemoryLimit
- ==> Attriber:StoreLimit
- ==> Attriber:StorePercentUsage
- ==> Attriber:TempLimit
- ==> Attriber:TempPercentUsage
- ==> Attriber:StatisticsEnabled
- ==> Attriber:OpenWireURL
- ==> Attriber:StompURL
- ==> Attriber:SslURL
- ==> Attriber:StompSslURL
- ==> Attriber:VMURL
- ==> Attriber:DataDirectory
- ==> Attriber:JMSJobScheduler
- ==> Operation:gc
- ==> Operation:stop
- ==> Operation:enableStatistics
- ==> Operation:addConnector
- ==> Operation:removeConnector
- ==> Operation:addNetworkConnector
- ==> Operation:removeNetworkConnector
- ==> Operation:stopGracefully
- ==> Operation:resetStatistics
- ==> Operation:disableStatistics
- ==> Operation:terminateJVM
- ==> Operation:addTopic
- ==> Operation:addQueue
- ==> Operation:removeTopic
- ==> Operation:removeQueue
- ==> Operation:createDurableSubscriber
- ==> Operation:destroyDurableSubscriber
- ==> Operation:reloadLog4jProperties
- ==> Operation:getTransportConnectorByType
- ==> Operation:start
根据这些,我们就可以拿到broker,connector,producer,consumer,queue,topic,Subscription等等的Object对象,进一步的操作他们。
待续。
原文地址:http://blog.csdn.net/kimmking/article/details/9170563