設置密碼文件很是重要,特別是在多用戶的環境下。我按如下步驟在jdk 1.5.0_08jrelibmanagement目錄下創建密碼文件:java
---用密碼模板文件(文件名jmxremote.password.template)拷貝出一個名爲jmxremote.password的新文件服務器
---將密碼文件的文件權限設置爲只有你能讀寫url
---爲角色設置密碼,如monitorRole 和controlRolespa
---當啓動JVM時系統屬性已經設置成表2的樣子code
爲了可以在啓動Tomcat服務器時啓用遠程JMX監測,要對位於CATALINA_HOME/bin目錄下的 Tomcat啓動腳本(catalina.bat 或catalina.sh)作以下修改:server
在catalina.sh中找到 # ----- Execute The Requested Command -----------------------------------------中間件
添加以下代碼:對象
CATALINA_OPTS="-Dcom.sun.management.jmxremote.port=8901ip
-Dcom.sun.management.jmxremote.ssl=falsessl
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.password.file=jmxremote.password
-Dcom.sun.management.jmxremote.access.file=jmxremote.access
-Djava.rmi.server.hostname=172.16.41.89"
在bin文件夾中加入jmxremote.password和jmxremote.access
jmxremote.access:
admin readwrite
monitor readonly
jmxremote.password:
admin test
monitor test
兩文件的權限爲400
Jmanager上的url地址配置
service:jmx:rmi:///jndi/rmi://localhost:8901/jmxrmi
複製catalina.sh成jmxcatalina.sh
把startup.sh中catalina.sh換成jmxcatalina.sh
實際上來講咱們能夠用jmx來監控一些java應用的運行狀況,還有本身寫的一些服務類的應用。
如下是咱們用來作監控的jmx源代碼
package com.shine.framework.Jmx; import java.util.HashMap; import java.util.Map; import javax.management.MBeanServerConnection; import javax.management.ObjectName; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; public class JMXManager { /** * 創建鏈接 * * @param ip * @param jmxport * @return */ public static MBeanServerConnection createMBeanServer(String ip, String jmxport, String userName, String password) { try { String jmxURL = "service:jmx:rmi:///jndi/rmi://" + ip + ":" + jmxport + "/jmxrmi"; // jmx // url JMXServiceURL serviceURL = new JMXServiceURL(jmxURL); Map map = new HashMap(); String[] credentials = new String[] { userName, password }; map.put("jmx.remote.credentials", credentials); JMXConnector connector = JMXConnectorFactory.connect(serviceURL, map); MBeanServerConnection mbsc = connector.getMBeanServerConnection(); return mbsc; } catch (Exception e) { // e.printStackTrace(); System.err.println(ip + "的中間件不能夠達"); } return null; } /** * 獲取全部屬性 * * @param mbeanServer * @param objName * @return */ public static Map getAllAttribute(MBeanServerConnection mbeanServer, ObjectName objName) { if (mbeanServer == null || objName == null) throw new IllegalArgumentException(); try { return null; } catch (Exception e) { return null; } } /** * 使用MBeanServer獲取對象名爲[objName]的MBean的[objAttr]屬性值 * <p> * 靜態代碼: return MBeanServer.getAttribute(ObjectName name, String attribute) * * @param mbeanServer * - MBeanServer實例 * @param objName * - MBean的對象名 * @param objAttr * - MBean的某個屬性名 * @return 屬性值 */ private static Object getAttribute(MBeanServerConnection mbeanServer, ObjectName objName, String objAttr) { if (mbeanServer == null || objName == null || objAttr == null) throw new IllegalArgumentException(); try { return String.valueOf(mbeanServer.getAttribute(objName, "currentThreadsBusy")); } catch (Exception e) { return null; } } }