设置密码文件非常重要,特别是在多用户的环境下。我按以下步骤在jdk 1.5.0_08jrelibmanagement目录下建立密码文件:
---用密码模板文件(文件名jmxremote.password.template)拷贝出一个名为jmxremote.password的新文件
---将密码文件的文件权限设置为只有你能读写
---为角色设置密码,如monitorRole 和controlRole
---当启动JVM时系统属性已经设置成表2的样子
为了能够在启动Tomcat服务器时启用远程JMX监测,要对位于CATALINA_HOME/bin目录下的 Tomcat启动脚本(catalina.bat 或catalina.sh)做如下修改:
在catalina.sh中找到 # ----- Execute The Requested Command -----------------------------------------
添加如下代码:
CATALINA_OPTS="-Dcom.sun.management.jmxremote.port=8901
-Dcom.sun.management.jmxremote.ssl=false
-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;
}
}
}