JMX 入门例子

来源:互联网 发布:淘宝的体检中心在哪里 编辑:程序博客网 时间:2024/05/16 07:30

参考链接:http://rabbit9898.iteye.com/blog/1009198

参考链接:http://jasonhan-sh-hotmail-com.iteye.com/blog/1164563

参考链接:http://www.cnblogs.com/zjstar12/archive/2012/06/10/2544387.html

参考链接:http://www.cnblogs.com/FlyAway2013/p/jmx.html

参考链接:http://tuhaitao.iteye.com/blog/807398


JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。

 

  我们还是从JMX能给我们提供什么好处入手来理解吧。举一个应用实例:在一个系统中常常会有一些配置信息,比如服务的IP地址,端口号什么的,那么如何来写这些代码呢? 

1、初级程序员一般是写死在程序里,到要改变时就去改程序,然后再编译发布; 

2、程序熟手则一般把这些信息写在一个配置文件里(JAVA一般都是*.properties文件), 
    到要改变时只要改配置文件,但还是重新启动系统,以便读取配置文件里的新值; 

3、程序好手则会写一个段代码,把配置值缓存起来,系统在读值的时候,先看看配置文件有 
    没有更动。如有更改则重读一遍,否则从缓存里读取值 

4、程序高手则懂得取物为我所用,用JMX!把配置属性集中在一个类,然后写一个叫MBean 
    的东东,再配置一下就轻松搞定了。而且JMX自动提供了一个WEB页面来给你来改变这些 
    配置信息。


------------------------------------------------------------------------------------------------------------------------


JMX(Java Management Extensions:即java管理扩展)是一个为应用程序,设备,系统等植入管理功能的框架,
JMX可以跨越一系列异构操作系统平台,系统体系架构和网络传输协议,灵活的开发无缝集成的系统,网络和服务管理应用.
应用场景:在一个系统中通常会有一些配置信息,例如服务器的IP地址和端口号,并且这些信息可能在系统运行的过程中经常需要改动,
面对这样的问题,怎么办呢?如下提供了四种解决方法.
1.一种方法是:将这些信息写死在代码里,当需要修改某些配置时,修改代码,然后将修改完的代码重新编译,将服务重新部署,并重新启动.
2.二种方法是:用配置文件来保存这些信息,省去了编译代码步骤,但是仍然需要重新启动服务.
3.三种方法是:用配置文件来保存这些信息,并让系统在运行时定期检查配置文件是否发生变化,如果发生变化重新读取数据放入缓存中,
             这种方法是经常用的,但是额外增加了系统的繁琐性.
4.四种方法是:JMX为我们提供了更好的解决方案,我们可以把配置信息封装在一个称为MBean的对象中,
             JMX提供了现成的用户接口(例如jconsole)使我们在系统运行过程中修改这些信息,并且不需要重启服务.
         JDK工具套装中的jconsole是一个JMX兼容的图形界面工具,它能够连接到本地或远程的JVM,检测JVM的运行情况,
         例如内存使用情况,线程的数量,已装入类的数目等,jconsole将这些JVM的数据以图形化的方式直观展现给用户.
JMX机构分为三层:自下向上依次是:设备层,代理层和分布式服务层.
设备层:定义成包括所有被管理和监测的资源,我们把这些资源统称为托管资源,托管资源被包装成一个MBean,
       以便资源能够被JMX兼容的应用程序(例如jconsole)所管理.MBean共有四种类型:标准Bean,动态Bean,开放Bean和模型Bean.
代理层:代理层的实现是MBeanServer对象,所有的MBean对象都需要注册到MBeanServer上,以便被查询和控制.
分布式服务:分布式服务定义了JMX应用程序所需的接口,JMX应用程序通过该接口与MBean进行交互.
JMX约定:注册MBeanServer的MBean名称后缀必须是MBean,否则JMX无法识别.例如如果想将类名Log(包含三个属性id,name,log)的类注册到JMX,
需要为Log类定义接口LogMBean.在LogMean中如果包含属性的get方法,那么会在jconsole窗口中对应的属性列表中看到,
如果定义了其他方法(非get方法),会在jconsole窗口中对应的操作列表中看到.



 

参考Java提供的例子(需要 jdk1.6):

http://download.oracle.com/javase/6/docs/technotes/guides/jmx/examples.html

 

1. 需要被管理类的接口  HelloMBean.java  (规范一般是***MBean.java)


package com.eastcom.first.spark.server.jmx;public interface HelloMBean {// operationspublic void sayHello();public int add(int x, int y);// attributes// a read-only attribute called Name of type Stringpublic String getName();// a read-write attribute called CacheSize of type intpublic int getCacheSize();public void setCacheSize(int size);}


2. 需要管理的类  Hello.java  (通常是实现**MBean.java)


package com.eastcom.first.spark.server.jmx;public class Hello implements HelloMBean {private final String name = "Reginald";private int cacheSize = DEFAULT_CACHE_SIZE;private static final int DEFAULT_CACHE_SIZE = 200;public void sayHello() {System.out.println("hello, world");}public int add(int x, int y) {return x + y;}public String getName() {return this.name;}public int getCacheSize() {return this.cacheSize;}public synchronized void setCacheSize(int size) {this.cacheSize = size;System.out.println("Cache size now " + this.cacheSize);}}


3. 代理/注册类JmxMain.java

package com.eastcom.first.spark.server.jmx;import java.lang.management.ManagementFactory;import java.lang.management.OperatingSystemMXBean;import java.lang.management.ThreadMXBean;import javax.management.MBeanServer;import javax.management.MBeanServerConnection;import javax.management.MBeanServerInvocationHandler;import javax.management.ObjectName;import javax.management.remote.JMXConnector;import javax.management.remote.JMXConnectorFactory;import javax.management.remote.JMXServiceURL;public class JmxMain {public static void main(String[] args) throws Exception {// Get the Platform MBean ServerMBeanServer mbs = ManagementFactory.getPlatformMBeanServer();// Construct the ObjectName for the MBean we will register// 每一个MBean都有一个唯一的标识: com.eastcom.first.spark.server.jmx:type=Hello// 命名规范: <包名:type=类名>ObjectName name = new ObjectName("com.eastcom.first.spark.server.jmx:type=Hello");// Create the Hello World MBeanHelloMBean mbean = new Hello();// Register the Hello World MBeanmbs.registerMBean(mbean, name);// Wait foreverSystem.out.println("Waiting forever...");try {// connect to a separate VM's MBeanServer, using the JMX RMI// functionality// 链接(远程|本地) jvm的创建MBeanServerConnection。JMXServiceURL address = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9998/jmxrmi");JMXConnector connector = JMXConnectorFactory.connect(address);MBeanServerConnection mbsc = connector.getMBeanServerConnection();ThreadMXBean threadBean = ManagementFactory.newPlatformMXBeanProxy(mbsc,ManagementFactory.THREAD_MXBEAN_NAME, ThreadMXBean.class);System.out.println("ThreadCount : " + threadBean.getThreadCount());// 线程数量// newPlatformMXBeanProxy 用于平台MBean ,抽取 自定义的MBean 会报错。OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.newPlatformMXBeanProxy(mbsc,ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME, OperatingSystemMXBean.class);System.out.println("add :" + operatingSystemMXBean.getName());// newProxyInstance用于调用自定义的HelloMBean接口,并且远程调用方式调用HelloMBean接口。HelloMBean helloMBean = MBeanServerInvocationHandler.newProxyInstance(mbsc, name, HelloMBean.class, true);int cacheSize = helloMBean.getCacheSize();System.out.println("hello :" + cacheSize);} catch (Exception e) {e.printStackTrace();}Thread.sleep(Long.MAX_VALUE);}}


4. 编译、测试运行上面的程序

 

javac com/example/mbeans/*.java

# 启动程序

java com.example.mbeans.Main

另起一个命令行或者cmd:

运行jconsole  (# JConsole is located in $(J2SE_HOME)/bin/jconsole) 可以看到,选择本地的进程 com.example.mbeans 连接 就可以进行管理了。

 


 

管理界面:

 



 
修改cacheSize 大小,可以在启动Main的命令行窗口看到修改生效。

 



在eclipse中运行的时候,


1. 在JmxDemo.java文件中,右键—>Run As—>Run Configurations...;

2. 左边选择你要执行的程序,此处是JmxDemo,在右边Name中会显示你选择的程序,Main选项卡还会显示程序所在的工程名称和执行类,确定这些后切换到Arguments选项卡;

3. 在VM arguments文本框中添加如下的参数

-Dcom.sun.management.jmxremote.port=9998
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false

 

点击Apply,然后Run即可

 

 

5.应用场景 
  5.1用来管理应用程序的配置项,可以在运行期动态改变配置项的值,而不用妨碍程序的运行,这对与许多可靠性要求较高的应用来说非常方便。 
    可以通过jconsole等JMX客户端工具动态改变配置项的值。 
  5.2用来对应用程序的运行状态进行监控,比如对一个大型交易处理程序,我们要监控当前有多少交易在排队中,每笔交易的处理时间是多少,平均每处理一笔交易要花多少时间等等。 

 


原创粉丝点击