JMX操作ActiveMQ(1)

我们知道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("	Domain[" + 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("	" + 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("	 ==> Attriber:" + m.getName());
		}
		if (info.getOperations().length > 0){
			for(MBeanOperationInfo m : info.getOperations())
				System.out.println("	 ==> 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对象,进一步的操作他们。

待续。

原文地址:https://www.cnblogs.com/dyllove98/p/3155373.html