zoukankan      html  css  js  c++  java
  • JMX(Java Management Extensions,即Java管理扩展)

    1.JMX概念和实例

    JMXJava 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目录下\libmanagementmanagement.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);
            
        }
    	
    
    }
    






  • 相关阅读:
    mongodb查询部分满足条件的列
    java属性文件读取,属性修改
    url中的jsessionid解释
    windows下mongodb设置用户名密码&用python连接
    Linux下Redis的安装和部署 详细
    Windows下手动安装redis服务
    Windows下安装Redis服务
    Python装饰器单例
    Django学习之全局变量
    Python3中 对local和nonlocal 关键字的改善认识(新手向)
  • 原文地址:https://www.cnblogs.com/liaomin416100569/p/9331306.html
Copyright © 2011-2022 走看看