遠程監控JVM狀態需要在JVM啟動的時候需要加上一段代碼開啟這個功能。(以下全部以ubuntu-14-04-server、jdk1.8、tomcat7.0環境為基礎)
配置的時候分兩種情況:1、無需配置用戶訪問權限;2、需要配置用戶訪問權限
先看第一種:
首先更改tomcat啟動參數(vim catalina.sh)
找到 # OS specific support. $var _must_ be set to either true or false. 添加如下變量:
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.port=9999 --此端口號自定義,只要不是常用的或者系統已使用的即可,此處設置為1090,此端口號不是java業務進程的端口號,所以不要混淆了。
-Dcom.sun.management.jmxremote.authenticate=false --不起用用戶訪問權限
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=10.111.43.164" 此處hostname設置為要監控的進程所在機器的IP(進程本機)
注意這里的變量名千萬不要使用JAVA_OPTS,如果使用JAVA_OPTS作為變量名的話在使用shutdown.sh停服務的時候回提示端口已被占用
第二種是配置用戶權限:
找到 # OS specific support. $var _must_ be set to either true or false. 添加如下變量:
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.port=1090 --此端口號自定義,只要不是常用的或者系統已使用的即可,此處設置為1090
-Dcom.sun.management.jmxremote.authenticate=true --起用用戶訪問權限
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=10.111.43.164" --此處hostname設置為要監控的進程所在機器的IP(進程本機)
-Dcom.sun.management.jmxremote.acccess.file=/opt/apache-tomcat-7.0.57/jconsole/jmxremote.access -- 配置用戶訪問權限(這個目錄為自定義,只要能讀取到即可,無特殊要求)
-Dcom.sun.management.jmxremote.password.file=/opt/apache-tomcat-7.0.57/jconsole/jmxremote.password"
現在要配置訪問權限的驗證文件:
首先拷貝上面啟動參數多出來的兩個文件
root@ubuntu:/opt/apache-tomcat-7.0.57# mkdir jconsole
root@ubuntu:/opt/apache-tomcat-7.0.57# cp /opt/jdk1.8.0_60/jre/lib/management/jmxremote.access ./jconsole/
root@ubuntu:/opt/apache-tomcat-7.0.57# cp /opt/jdk1.8.0_60/jre/lib/management/jmxremote.password.template ./jconsole/jmxremote.password
然后需要變更文件的權限(訪問文件權限必須是600,否則會報錯,大家可以試一試):
root@ubuntu:/opt/apache-tomcat-7.0.57# chmod 600 ./jconsole/jmxremote.*
下面講講這兩個文件:
jmxremote.access里面其實最主要的就是兩行:
monitorRole readonly --這個只的是監控角色,權限為只讀,如果僅僅只監控目的使用這個權限即可
controlRole readwrite --這個具有操作權限,可以停起server。
jmxremote.password這個文件里面需要將最下面兩行的注釋給去掉,此處就是后面代碼里面需要驗證的用戶名和密碼(此處的兩個用戶一個是monitorRole,密碼為QED;另一個用戶為controlRole,密碼為R&D),此處的用戶名密碼是可以自定義成的。
monitorRole QED
controlRole R&D
自定義效果如下:
jmxremote.access
monitorRole-admin readonly
controlRole-admin readwrite
jmxremote.password
monitorRole-admin !QAZ123
controlRole-admin !QAZ123
到這里服務器端的配置就結束了,下面就只要重啟server即可。
下面就到代碼部分:
String jmxURL = "service:jmx:rmi:///jndi/rmi://10.111.43.164:1090/jmxrmi";
JMXServiceURL serviceURL = new JMXServiceURL(jmxURL);
Map<String, String[]> map = new HashMap<String, String[]>();
String[] credentials = new String[] { "monitorRole-admin", "!QAZ123" };
map.put("jmx.remote.credentials",credentials);
JMXConnector connector = JMXConnectorFactory.connect(serviceURL,map);
MBeanServerConnection msc = connector.getMBeanServerConnection();