CollTomcat.java 9.1 KB
package com.sitech.ismp.coll.middleware.tomcat.impl;

import org.apache.log4j.Logger;

import javax.management.MBeanAttributeInfo;
import javax.management.MBeanInfo;
import javax.management.MBeanServerConnection;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.QueryExp;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import java.io.IOException;
import java.lang.management.MemoryUsage;
import java.net.MalformedURLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class CollTomcat {

	private static Logger log= Logger.getLogger(CollTomcat.class);

	HashMap<String, String[]> environmentMap = null;
	private MBeanServerConnection mbeanServerConn = null;
	JMXConnector JMXConn = null;

	public MBeanServerConnection getMbeanServerConn() {
		return mbeanServerConn;
	}

	public void init(HashMap<String, String> params) {
		String jmxurl = params.get("JMX_URL");
		// frank 添加 IP参数,用于获取Tomcat所在主机的ping状态。
		int start=jmxurl.indexOf("://");
		int end=jmxurl.lastIndexOf(":");
		String ip=jmxurl.substring(start+15,end);
		params.put("ip",ip);
		try {
			JMXServiceURL serverURL = new JMXServiceURL(jmxurl);
			try {

				if (this.environmentMap != null) {
					JMXConn = JMXConnectorFactory.connect(serverURL, this.environmentMap);
				} else {
					JMXConn = JMXConnectorFactory.connect(serverURL);
				}
				mbeanServerConn = JMXConn.getMBeanServerConnection();
			} catch (IOException e) {
				e.printStackTrace();
			}
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}
	
	protected Object execute(String objName, String attribute) {
		Object value = "";
		try {
			ObjectName exeObjName = new ObjectName(objName);
			value = this.getMbeanServerConn().getAttribute(exeObjName, attribute);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return value;
	}
	
	protected HashMap<String, Object> executeAttributeArray(String objName, String[] attributes) {
		HashMap<String, Object> resultMap = new HashMap<String, Object>();
		try {
			ObjectName exeObjName = new ObjectName(objName);
			for (String attr : attributes) {
				Object value = this.getMbeanServerConn().getAttribute(exeObjName, attr);
				resultMap.put(attr, value);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return resultMap;
	}

	protected List<HashMap<String, Object>> executQueryNames(String objName, String args[]) {
		List<HashMap<String, Object>> exeResult = new ArrayList<HashMap<String, Object>>();
		try {
			ObjectName objectName = new ObjectName(objName);
			Set<ObjectName> namesSet = this.getMbeanServerConn().queryNames(objectName, null);
			for (ObjectName obj : namesSet) {
				String name = obj.getKeyProperty("name");
				ObjectName objname = new ObjectName(obj.getCanonicalName());
				if (name != null) {
					HashMap<String, Object> resultMap = new HashMap<String, Object>();
					resultMap.put("name", name);
					for (String param : args) {
						Object value = this.getMbeanServerConn().getAttribute(objname, param);
						resultMap.put(param, value != null ? value : "0");
					}
					exeResult.add(resultMap);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return exeResult;
	}

	@SuppressWarnings("unchecked")
	protected Set<ObjectInstance> executeQueryMbeans(String objName, QueryExp exp) {
		Set<ObjectInstance> managerSet = null;
		try {
			ObjectName managerObjName = new ObjectName(objName);
			managerSet = this.getMbeanServerConn().queryMBeans(managerObjName, exp);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return managerSet;
	}

	protected void release() {
		try {
			if(null != JMXConn){
				this.JMXConn.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	protected void test() {
		try {
			String jmxURL = "service:jmx:rmi:///jndi/rmi://172.21.1.100:1090/jmxrmi";
			JMXServiceURL serviceURL = new JMXServiceURL(jmxURL);
			Map map = new HashMap();
			String[] credentials = new String[] { "monitorRole", "QED" };
			map.put("jmx.remote.credentials", credentials);
			JMXConnector connector = JMXConnectorFactory.connect(serviceURL, map);
			MBeanServerConnection mbsc = connector.getMBeanServerConnection();
			// 端口最好是动态取得
			ObjectName threadObjName = new ObjectName("Catalina:type=ThreadPool,name=\"http-bio-8080\"");
			MBeanInfo mbInfo = mbsc.getMBeanInfo(threadObjName);
			String attrName = "currentThreadCount";// tomcat的线程数对应的属性值
			MBeanAttributeInfo[] mbAttributes = mbInfo.getAttributes();
			System.out.println("currentThreadCount:" + mbsc.getAttribute(threadObjName, attrName));
			// heap
			for (int j = 0; j < mbsc.getDomains().length; j++) {
				System.out.println("###########" + mbsc.getDomains()[j]);
			}
			Set MBeanset = mbsc.queryMBeans(null, null);
			System.out.println("MBeanset.size() : " + MBeanset.size());
			Iterator MBeansetIterator = MBeanset.iterator();
			while (MBeansetIterator.hasNext()) {
				ObjectInstance objectInstance = (ObjectInstance) MBeansetIterator.next();
				ObjectName objectName = objectInstance.getObjectName();
				String canonicalName = objectName.getCanonicalName();
				System.out.println("canonicalName : " + canonicalName);
				if (canonicalName.equals("Catalina:host=localhost,type=Cluster")) {
					// Get details of cluster MBeans
					System.out.println("Cluster MBeans Details:");
					System.out.println("=========================================");
					// getMBeansDetails(canonicalName);
					String canonicalKeyPropList = objectName.getCanonicalKeyPropertyListString();
				}
			}
			// ------------------------- system ----------------------
			ObjectName runtimeObjName = new ObjectName("java.lang:type=Runtime");
			System.out.println("厂商:" + (String) mbsc.getAttribute(runtimeObjName, "VmVendor"));
			System.out.println("程序:" + (String) mbsc.getAttribute(runtimeObjName, "VmName"));
			System.out.println("版本:" + (String) mbsc.getAttribute(runtimeObjName, "VmVersion"));
			Date starttime = new Date((Long) mbsc.getAttribute(runtimeObjName, "StartTime"));
			SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			System.out.println("启动时间:" + df.format(starttime));
			Long timespan = (Long) mbsc.getAttribute(runtimeObjName, "Uptime");
			// ------------------------ JVM -------------------------
			// 堆使用率
			ObjectName heapObjName = new ObjectName("java.lang:type=Memory");
			MemoryUsage heapMemoryUsage = MemoryUsage.from((CompositeDataSupport) mbsc.getAttribute(heapObjName, "HeapMemoryUsage"));
			long maxMemory = heapMemoryUsage.getMax();// 堆最大
			long commitMemory = heapMemoryUsage.getCommitted();// 堆当前分配
			long usedMemory = heapMemoryUsage.getUsed();
			System.out.println("heap:" + (double) usedMemory * 100 / commitMemory + "%");// 堆使用率

			MemoryUsage nonheapMemoryUsage = MemoryUsage
					.from((CompositeDataSupport) mbsc.getAttribute(heapObjName,
							"NonHeapMemoryUsage"));
			long noncommitMemory = nonheapMemoryUsage.getCommitted();
			long nonusedMemory = heapMemoryUsage.getUsed();
			System.out.println("nonheap:" + (double) nonusedMemory * 100
					/ noncommitMemory + "%");

			ObjectName permObjName = new ObjectName(
					"java.lang:type=MemoryPool,name=Perm Gen");
			MemoryUsage permGenUsage = MemoryUsage
					.from((CompositeDataSupport) mbsc.getAttribute(permObjName,
							"Usage"));
			long committed = permGenUsage.getCommitted();// 持久堆大小
			long used = heapMemoryUsage.getUsed();//   
			System.out.println("perm gen:" + (double) used * 100 / committed
					+ "%");// 持久堆使用率

			// -------------------- Session ---------------
			ObjectName managerObjName = new ObjectName(
					"Catalina:type=Manager,*");
			Set<ObjectName> s = mbsc.queryNames(managerObjName, null);
			for (ObjectName obj : s) {
				System.out.println("应用名:" + obj.getKeyProperty("path"));
				ObjectName objname = new ObjectName(obj.getCanonicalName());
				System.out.println("最大会话数:"
						+ mbsc.getAttribute(objname, "maxActiveSessions"));
				System.out.println("会话数:"
						+ mbsc.getAttribute(objname, "activeSessions"));
				System.out.println("活动会话数:"
						+ mbsc.getAttribute(objname, "sessionCounter"));
			}

			// ----------------- Thread Pool ----------------
			ObjectName threadpoolObjName = new ObjectName(
					"Catalina:type=ThreadPool,*");
			Set<ObjectName> s2 = mbsc.queryNames(threadpoolObjName, null);
			for (ObjectName obj : s2) {
				System.out.println("端口名:" + obj.getKeyProperty("name"));
				ObjectName objname = new ObjectName(obj.getCanonicalName());
				System.out.println("最大线程数:"
						+ mbsc.getAttribute(objname, "maxThreads"));
				System.out.println("当前线程数:"
						+ mbsc.getAttribute(objname, "currentThreadCount"));
				System.out.println("繁忙线程数:"
						+ mbsc.getAttribute(objname, "currentThreadsBusy"));
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}