OS:win7
jdk:1.6
Tomcat:7.0.26
1.Java的環境變量配置正確,網上很多,不再說了
2.修改Tomcat目錄下的bin\catalina.bat
在該文件中查找set JAVA_OPTS=%JAVA_OPTS%,下面有一行為:
rem ----- Execute The Requested Command ---------------------------------------
在這一行的下面加
set JAVA_OPTS=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9008 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
說明:9008為端口號,一會兒要用到。很多地方說tomcat需要權限驗證,可是我這里沒有用到,就可以連接成功,所以沒有測試密碼文件,僅將Dcom.sun.management.jmxremote.authenticate的值設為false。
3.記得編輯完bin\catalina.bat后,一定要雙擊執行。直接雙擊就可以,不要在cmd中執行,我執行出錯(不知道為什么)
4.雙擊bin\startup.bat,最好雙擊執行,我在cmd中執行,無法啟動Tomcat
5.在cmd中執行netstat -an,可查看到9008端口已經啟用,說明Tomcat的Jmx配置成功
6.在cmd中敲入:jconsole(這個exe令在C:\Program Files\Java\jdk1.6.0_23\bin,即安裝目錄的bin下),即可啟動jconsole的管理界面,在界面中輸入如下內容:
service:jmx:rmi:///jndi/rmi://localhost:9008/jmxrmi
localhost:9008
即可進入管理界面,在管理界面的Tab頁MBeans中,可以看到所有的MBeans
OS:xp
jdk:1.6
Tomcat:6.0.29
1.Java的環境變量配置正確,網上很多,不再說了
2.修改Tomcat目錄下的bin\catalina.bat
在該文件中查找set JAVA_OPTS=%JAVA_OPTS%,下面有一行為:
rem ----- Execute The Requested Command ---------------------------------------
在這一行的下面加
set JAVA_OPTS=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9008 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
說明:9008為端口號,一會兒要用到。很多地方說tomcat需要權限驗證,可是我這里沒有用到,就可以連接成功,所以沒有測試密碼文件,僅將Dcom.sun.management.jmxremote.authenticate的值設為false。
3.記得編輯完bin\catalina.bat后,一定要雙擊執行。直接雙擊就可以,不要在cmd中執行,我執行出錯(不知道為什么)
4.雙擊bin\startup.bat,最好雙擊執行,我在cmd中執行,無法啟動Tomcat
5.在cmd中執行netstat -an,可查看到9008端口已經啟用,說明Tomcat的Jmx配置成功
6.在cmd中敲入:jconsole(這個exe令在C:\Program Files\Java\jdk1.6.0_23\bin,即安裝目錄的bin下),即可啟動jconsole的管理界面,在界面中輸入如下內容:
service:jmx:rmi:///jndi/rmi://localhost:9008/jmxrmi
localhost:9008
即可進入管理界面,在管理界面的Tab頁MBeans中,可以看到所有的MBeans
下面在代碼中使用Jmx獲取Tomcat中MBean的值
OS:xp jdk:1.6 Tomcat:6.0.29 1.Java的環境變量配置正確,網上很多,不再說了 2.修改Tomcat目錄下的bin\catalina.bat 在該文件中查找set JAVA_OPTS=%JAVA_OPTS%,下面有一行為: rem ----- Execute The Requested Command --------------------------------------- 在這一行的下面加 set JAVA_OPTS=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9008 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false 說明:9008為端口號,一會兒要用到。很多地方說tomcat需要權限驗證,可是我這里沒有用到,就可以連接成功,所以沒有測試密碼文件,僅將Dcom.sun.management.jmxremote.authenticate的值設為false。 3.記得編輯完bin\catalina.bat后,一定要雙擊執行。直接雙擊就可以,不要在cmd中執行,我執行出錯(不知道為什么) 4.雙擊bin\startup.bat,最好雙擊執行,我在cmd中執行,無法啟動Tomcat 5.在cmd中執行netstat -an,可查看到9008端口已經啟用,說明Tomcat的Jmx配置成功 6.在cmd中敲入:jconsole(這個exe令在C:\Program Files\Java\jdk1.6.0_23\bin,即安裝目錄的bin下),即可啟動jconsole的管理界面,在界面中輸入如下內容: service:jmx:rmi:///jndi/rmi://localhost:9008/jmxrmi 或者 localhost:9008 即可進入管理界面,在管理界面的Tab頁MBeans中,可以看到所有的MBeans 此時,Jmx監控Tomcat配置成功! 下面在代碼中使用Jmx獲取Tomcat中MBean的值 import java.util.*; import javax.management.*; import javax.management.remote.*;; public class JmxTest { public static void main(String[] args) { // TODO Auto-generated method stub try { --這里的url是在上圖中輸入的url JMXServiceURL url=new JMXServiceURL ("service:jmx:rmi:///jndi/rmi://localhost:9008/jmxrmi"); //Map<String, String[]> map = new HashMap(); //String[] credentials=new String[] {"monitorRole","QED"}; //map.put("jmx.remote.credentials",credentials); JMXConnector conn=JMXConnectorFactory.connect(url); System.out.println("JMXConnector="+conn.toString()); String id=conn.getConnectionId(); System.out.println("Connection Id=" + id); MBeanServerConnection mbsc = conn.getMBeanServerConnection(); String domains[]=mbsc.getDomains(); System.out.println("# of domains="+domains.length); for (int i = 0; i < domains.length; i++) { System.out.println("Domain[" + i + "]=" + domains[i]); } Set<ObjectInstance> MBeanset = mbsc.queryMBeans(null, null); System.out.println("MBeanset.size() : " + MBeanset.size()); Iterator<ObjectInstance> MBeansetIterator = MBeanset.iterator(); while (MBeansetIterator.hasNext()) { ObjectInstance objectInstance = (ObjectInstance)MBeansetIterator.next(); ObjectName objectName= objectInstance.getObjectName(); String canonicalName= objectName.getCanonicalName(); System.out.println("canonicalName : " + canonicalName); --在上圖中,有Catalina:type=Server的port的值8005,運行程序后,在控制台能看到獲取成功 if (objectName.toString().equals("Catalina:type=Server")) { // Get details of cluster MBeans String s = mbsc.getAttribute(objectName, "port").toString(); System.out.println("========================================="); System.out.println(s); System.out.println("========================================="); } //String canonicalKeyPropList=objectName.getCanonicalKeyPropertyListString(); } conn.close(); } catch(Exception ex) { System.out.println("Illegal Argument Exception: " + ex); } } }
下面是經過整理的代碼,里面有一部分垃圾代碼,大家可以選擇性的看。
import java.math.BigDecimal; import java.util.*; import javax.management.*; import javax.management.remote.*; import javax.naming.Context; public class JmxTest { public static void main(String[] args) { JMXConnector conn = null; try { MBeanServerConnection mbsc = ConnJmx(conn); String KeyName = ""; String objectName = ""; String attributeName = ""; String attributeKey = ""; String value = ""; objectName = "java.lang:type=Memory"; attributeName = "NonHeapMemoryUsage"; attributeKey = "init"; value = GetValueByKey(objectName, attributeName, attributeKey); PrintContext(attributeName,value); KeyName = "進程數"; objectName = "java.lang:type=Threading"; attributeName = "ThreadCount"; attributeKey = ""; value = GetValueByKey(mbsc, objectName, attributeName, attributeKey); PrintContext(attributeName,value); KeyName = "正常運行時間"; objectName = "java.lang:type=Runtime"; attributeName = "Uptime"; attributeKey = ""; value = GetValueByKey(mbsc, objectName, attributeName, attributeKey); //System.out.println(attributeName + "=" + value); //value = ConvertMillToText(Long.parseLong(value)); PrintContext(attributeName,value); } catch(Exception ex) { System.out.println("Exception: " + ex); } finally { try { if (conn != null) { conn.close(); } } catch(Exception ex1){} } } private static void PrintContext(String key, String value) { System.out.println(key + "=" + value); } //從毫秒轉至小時分鍾 private static String ConvertMillToText(long millsecond)throws Exception { try { String s = ""; double d = (double)millsecond / (double)(1000*60*60); BigDecimal b = new BigDecimal(d); int hour = (int)Math.floor(d); double minute = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); if (hour > 0) { s = hour + " 小時 "; } minute = (minute - hour) * 60; b = new BigDecimal(minute); minute = b.setScale(0, BigDecimal.ROUND_HALF_UP).doubleValue(); s += (int)minute + " 分鍾"; return s; } catch(Exception ex) { System.out.println("Exception: " + ex); throw ex; } } //連接到jmx private static MBeanServerConnection ConnJmx(JMXConnector conn)throws Exception { try { String _value = ""; JMXServiceURL url = new JMXServiceURL ("service:jmx:iiop:///jndi/corbaname::1.2@192.168.1.146:6888#jmx/rmi/RMIConnectorServer"); HashMap map = new HashMap(); String[] credentials=new String[] {"admin","admin"}; map.put("jmx.remote.credentials",credentials); conn = JMXConnectorFactory.connect(url, map); String id=conn.getConnectionId(); MBeanServerConnection mbsc = conn.getMBeanServerConnection(); return mbsc; } catch(Exception ex) { System.out.println("Illegal Argument Exception: " + ex); throw ex; } } //從MBeanServerConnection中取值 private static String GetValueByKey(MBeanServerConnection mbsc, String objectName, String attributeName, String attributeKey)throws Exception { try { String _value = ""; ObjectName _objectName = new ObjectName(objectName); if (attributeKey.equals("")) { _value = mbsc.getAttribute(_objectName, attributeName).toString(); } else { javax.management.openmbean.CompositeData data = (javax.management.openmbean.CompositeData)mbsc.getAttribute(_objectName, attributeName); _value = data.get(attributeKey).toString(); } return _value; } catch(Exception ex) { System.out.println("Illegal Argument Exception: " + ex); throw ex; } } private static String GetValueByKey(String objectName, String attributeName, String attributeKey)throws Exception { JMXConnector conn = null; try { String _value = ""; JMXServiceURL url=new JMXServiceURL ("service:jmx:iiop:///jndi/corbaname::1.2@192.168.1.146:6888#jmx/rmi/RMIConnectorServer"); HashMap map = new HashMap(); String[] credentials=new String[] {"admin","admin"}; map.put("jmx.remote.credentials",credentials); conn = JMXConnectorFactory.connect(url, map); String id=conn.getConnectionId(); MBeanServerConnection mbsc = conn.getMBeanServerConnection(); //Set<ObjectInstance> MBeanset = mbsc.queryMBeans("java.lang:type=Memory", null); //Set<ObjectInstance> MBeanset = mbsc.queryMBeans(null, null); ObjectName _objectName = new ObjectName(objectName); if (attributeKey.equals("")) { _value = mbsc.getAttribute(_objectName, attributeName).toString(); } else { javax.management.openmbean.CompositeData data = (javax.management.openmbean.CompositeData)mbsc.getAttribute(_objectName, attributeName); _value = data.get(attributeKey).toString(); } return _value; } catch(Exception ex) { System.out.println("Illegal Argument Exception: " + ex); throw ex; } finally { if (conn != null) { conn.close(); } } } private static void TestConn()throws Exception { JMXConnector conn = null; try { //JMXServiceURL url=new JMXServiceURL ("service:jmx:rmi:///jndi/rmi://localhost:9008/jmxrmi"); JMXServiceURL url=new JMXServiceURL ("service:jmx:iiop:///jndi/corbaname::1.2@192.168.1.146:6888#jmx/rmi/RMIConnectorServer"); HashMap map = new HashMap(); String[] credentials=new String[] {"admin","admin"}; map.put("jmx.remote.credentials",credentials); conn = JMXConnectorFactory.connect(url, map); System.out.println("JMXConnector="+conn.toString()); String id=conn.getConnectionId(); System.out.println("Connection Id=" + id); MBeanServerConnection mbsc = conn.getMBeanServerConnection(); String domains[]=mbsc.getDomains(); System.out.println("# of domains="+domains.length); for (int i = 0; i < domains.length; i++) { System.out.println("Domain[" + i + "]=" + domains[i]); } Set<ObjectInstance> MBeanset = mbsc.queryMBeans(null, null); System.out.println("MBeanset.size() : " + MBeanset.size()); Iterator<ObjectInstance> 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 (objectName.toString().equals("Catalina:type=Server")) { // Get details of cluster MBeans String s = mbsc.getAttribute(objectName, "port").toString(); System.out.println("========================================="); System.out.println(s); System.out.println("========================================="); } //String canonicalKeyPropList=objectName.getCanonicalKeyPropertyListString(); } conn.close(); } catch(Exception ex) { System.out.println("Illegal Argument Exception: " + ex); throw ex; } finally { if (conn != null) { conn.close(); } } } }