JMX(Java Management Extensions,即Java管理扩展)
1.JMX概念和实例
JMX(Java Management Extensions,即Java管理扩展)
Jmx可以将按指定规则创建的javabean保存到java程序进程中并且可以通过jconsole动态修改bean的值当程序中需要配置某些数据时 如果将配置信息写死在代码中需要修改代码后重启写死在配置文件中修改配置文件后需要重启如果将数据从配置中读出并且写入jmx中可以直接修改内存中的配置值
mbean也就是被存入进程的对象 该对象必须先建立一个接口 该接口 必须以MBean结尾 否则会抛出
Exception in thread "main" javax.management.NotCompliantMBeanException: MBean class cn.et.jmx.SysConfigue does not implement DynamicMBean,
接口中带有get和set的就是属性 如果是非get和set的方法就是操作 可以通过页面操作手动调用方法测试
定义接口:
package com.test;
public interface SysConfigueMBean{
public String getUrl();
public void setUrl(String url);
public String getClassDriver() ;
public void setClassDriver(String classDriver);
public String getUname() ;
public void setUname(String uname);
public String getPwd() ;
public void setPwd(String pwd);
public int add(int p1,int p2);
}
定义实现类
package cn.et.jmx;
public class SysConfigue implements SysConfigueMBean {
private String url = "jdbc:Oracle:thin:@192.168.100.XXX:1521:plm";
private String classDriver = "oracle.jdbc.driver.OracleDriver";
private String uname = "XXX";
private String pwd = "xxxxx";
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getClassDriver() {
return classDriver;
}
public void setClassDriver(String classDriver) {
this.classDriver = classDriver;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public int add(int p1, int p2) {
return p1+p2;
}
}
主类用于将mbean的实例发布到jmx中
package cn.et.jmx;
import java.lang.management.ManagementFactory;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
public class Test {
/**
*时间:2017-6-1 下午05:27:33
*作者: LM
*联系方式:973465719@qq.com
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
//获取本机的mbean服务对象 用于注册mbean
MBeanServer mBeanServer = null;
if (MBeanServerFactory.findMBeanServer(null).size() > 0) {
mBeanServer =
(MBeanServer)MBeanServerFactory.findMBeanServer(null).get(0);
} else {
mBeanServer = ManagementFactory.getPlatformMBeanServer();
}
//对象名的作用为 用于创建jmx目录树的结构 :的mydb为根目录 也就是域
//比如mydb:type=oracle和mydb:type=mysql 都位于同一个域 也就是同一个根目录 mydb下
// :后边的键值对 中的值用于创建子目录 最后一个键值对的值用于创建叶子节点也就是对象 叶子节点上存储的就是mbean mbean存在属性和动作
// 键值对中的键主要适用于在其他客户端调用jmx搜索使用的 搜索时可以使用正则表达式
/**
* 比如:创建两个object
* mydb:type=oracle,version=5,name=ojdbc5
* mydb:type=oracle,version=6,name=ojdbc6
* oracle
* --oracle
* --5
* --objdbc5
* --属性
* --动作
* --6
* --ojdbc6
* --属性
* --动作
*/
ObjectName name5 = new ObjectName("mydb:type=oracle,version=5,name=ojdbc5");//中间必须有个:后面的必须是个键值对 类如abc:test=test
SysConfigue sc5=new SysConfigue();
mBeanServer.registerMBean(sc5, name5);
ObjectName name6 = new ObjectName("mydb:type=oracle,version=6,name=ojdbc6");//中间必须有个:后面的必须是个键值对 类如abc:test=test
SysConfigue sc6=new SysConfigue();
mBeanServer.registerMBean(sc6, name6);
ObjectName mysqlName = new ObjectName("mydb:type=mysql,version=5,name=mysql-connector-java-5.1.26");//中间必须有个:后面的必须是个键值对 类如abc:test=test
SysConfigue mysqlSc=new SysConfigue();
mysqlSc.setClassDriver("abc");
mBeanServer.registerMBean(mysqlSc, mysqlName);
Thread.sleep(Long.MAX_VALUE);
}
}
打开JAVA_HOME/bin/jconsole.exe找到本地类的选项 点击连接
连接成功后 选择 Mbean的页签
启动后 效果如下
如果需要读取到其他进程的mbean信息 当前的mbean注册server必须开启远程连接功能 【上面的例子 只能本机使用】
在运行mbean的发布类
cn.et.jmx.Test
时 需要添加三个 虚拟机的参数(eclipse右键-run configurations )
-Dcom.sun.management.jmxremote.port=8888
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
配置好后点击run 此时 本机开放了 8888端口 其他机器如果使用jconsole连接 该mbeanserver查看mbean信息 只需要输入 ip:端口即可
比如我们有时远程部署的tomcat需要远程调试 就可以在tomcat的 catalina.bat配置文件中添加这三句jmx的代码
-Dcom.sun.management.jmxremote.port=8888 --表示远程jmx的端口
-Dcom.sun.management.jmxremote.authenticate=false --是否要使用用户名和口令验证
-Dcom.sun.management.jmxremote.ssl=false --是否使用安全socket
jmx这三句 没必要记住 可以在jre下找到
JRE目录下\\lib\management\management.properties文件中
7行 # -Dcom.sun.management.jmxremote.port=<port-number>
169行 # com.sun.management.jmxremote.ssl=true|false
260行 # com.sun.management.jmxremote.authenticate=false
这里如果要使用用户名密码 需要配置jmxremote.password文件 有需要可以自行百度
2.JMX的其他客户端调用
package cn.et.jmx;
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 TestGet {
/**
*时间:2017-6-1 下午05:27:33
*作者: LM
*联系方式:973465719@qq.com
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
//url部分只需要修改mbean服务的ip和端口
String myurl="service:jmx:rmi:///jndi/rmi://192.168.58.1:8888/jmxrmi";
JMXServiceURL url=new JMXServiceURL(myurl);
JMXConnector jmxConnector=JMXConnectorFactory.connect(url);
MBeanServerConnection mbeanConn = jmxConnector.getMBeanServerConnection();
ObjectName name = new ObjectName("mydb:type=oracle,version=5,name=ojdbc5");
String urls=mbeanConn.getAttribute(name, "Url").toString();//获取这个mbean的Url属性
System.out.println(urls);
}
}