1.概念:
a.定义:JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。
b.作用:
1)程序初哥一般是写死在程序中,到要改变的时候就去修改代码,然后重新编译发布。
2)程序熟手则配置在文件中(JAVA一般都是properties文件),到要改变的时候只要修改配置文件,但还是必须重启系统,以便读取配置文件里最新的值。
3)程序好手则会写一段代码,把配置值缓存起来,系统在获取的时候,先看看配置文件有没有改动,如有改动则重新从配置里读取,否则从缓存里读取。
4)程序高手则懂得物为我所用,用JMX把需要配置的属性集中在一个类中,然后写一个MBean,再进行相关配置。另外JMX还提供了一个工具页,以方便我们对参数值进行修改。
2.Mbean准备
a.创建供外部调用的接口
public interface HelloMBean { public String getName(); public void setName(String name); public int getAge(); public void setAge(int age); public void helloWorld(String word); }
注意:接口 和 实现类 命名必须遵循一定的规范,如果我们的 MBean(实现类) 为 Hello,则接口必须为Hello + MBean。
b.创建实现类MBean
public class Hello implements HelloMBean { @Override public String getName() { System.out.println("获取名称:" + MyMemory.getInstance().getName()); return MyMemory.getInstance().getName(); } @Override public void setName(String name) { System.out.println("设置名称:" + name); MyMemory.getInstance().setName(name); } @Override public int getAge() { System.out.println("获取年龄:" + MyMemory.getInstance().getAge()); return MyMemory.getInstance().getAge(); } @Override public void setAge(int age) { System.out.println("设置年龄:" + age); MyMemory.getInstance().setAge(age); } @Override public void helloWorld(String word) { System.out.println("Hello world:" + word); } }
c.创建内存类用于测试
public class MyMemory { //单例 private static MyMemory instance = new MyMemory(); private MyMemory(){} public static MyMemory getInstance(){ return instance; } private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
3.开启远程JMX服务
a.通过Java启动命令开启
1)注册MBean
public static void main( String[] args ) throws Exception { MBeanServer server = ManagementFactory.getPlatformMBeanServer(); ObjectName helloName = new ObjectName("myJmxBean:name=helloService"); server.registerMBean(new Hello(), helloName); Thread.sleep(60 * 60 * 1000); }
2)在java启动参数中添加
#相关 JMX 代理侦听开关 -Dcom.sun.management.jmxremote=true #相关 JMX 代理侦听请求的端口 -Dcom.sun.management.jmxremote.port=9999 #指定是否使用 SSL 通讯 -Dcom.sun.management.jmxremote.ssl=false #指定是否需要密码验证 -Dcom.sun.management.jmxremote.authenticate=false #服务器端的IP -Djava.rmi.server.hostname=192.168.0.141
idea在此处添加
b.通过java代码启动
1)注册并启动jmx
public static void main( String[] args ) throws Exception { MBeanServer server = ManagementFactory.getPlatformMBeanServer(); ObjectName helloName = new ObjectName("myJmxBean:name=helloService"); server.registerMBean(new Hello(), helloName); //这个步骤很重要,注册一个端口,绑定url后用于客户端通过rmi方式连接JMXConnectorServer LocateRegistry.createRegistry(9999); //URL路径的结尾可以随意指定,但如果需要用Jconsole来进行连接,则必须使用jmxrmi JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi"); JMXConnectorServer jcs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server); jcs.start(); System.out.println("rmi start"); }
4.连接JMX服务
a.使用JConsole连接