我们知道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的属性和操作,同理也可以拿到其它对象的属性和操作列表。
根据这些,我们就可以拿到broker,connector,producer,consumer,queue,topic,Subscription等等的Object对象,进一步的操作他们。
待续。