来自:http://blog.csdn.net/derekjiang/article/details/4531952

JMX是一份规范,SUN依据这个规范在JDK(1.3、1.4、5.0)提供了JMX接口。而根据这个接口的实现则有很多种,比如Weblogic的JMX实现、MX4J、JBoss的JMX实现。在SUN自己也实现了一份,不过在JDK1.4之前,这件JMX实现(一些JAR包)是可选的,你得去它的网站上下载。JDK5.0则内嵌了进来,安装JDK5.0就可以开发基于JMX的代码了。

  但JDK5.0并非包含所有SUN的关于JMX的代码,有一些工具类是排除在JDK5.0之外的。下面根据所使用的JDK版本情况,谈一谈开发环境的准备。
1、JDK1.3、1.4
  去SUN网站下载SUN的JMX实现,共两个ZIP文件,下载网址:http://java.sun.com/products/JavaManagement/download.html
(1)jmx-1_2_1-ri.zip
   解压后的lib目录包含:jmxri.jar、jmxtools.jar
(2)jmx_remote-1_0_1_03-ri.zip
   解压后的lib目录包含:jmxremote.jar、jmxremote_optional.jar、rmissl.jar
  如果在DOS下用命令行开发,则把这五个JAR包加入到classpath系统变量中。如果你用Eclipse开发,则把JAR包加入到项目属性的Libratries(库)引用中。
2、JDK5.0以上
  JDK5.0的jre/lib/rt.jar已经包含了jmxri.jar、jmxremote.jar、rmissl.jar三个包的代码。如果你用到jmxtools.jar、jmxremote_optional.jar的类,则需要将这两个类加入到classpath或Eclipse的项目库引用中。
3、我使用的开发环境:JDK5.0 + Eclipse3.2。
  注:因为用到jmxtools.jar中的HtmlAdaptorServer类,所以将此包加入到项目库引用中。
Server端程序范例:
 
1. MBean接口
这是一个应用程序将要向外暴露的接口,在该接口中需要定义要公布的所有函数。
其中,如果存在一对对应的get方法和set方法,那么就默认有一个属性,且熟悉的名字就是get方法名字中get后面的部分。
包含在MBean中方法都将是可以被管理的。MBean起名是有规范的,就是原类名后加上MBean字样。
2. 被管理的类
被管理的类需要实现相应的MBean接口,通过MBean接口中的方法来被管理。
  1. package study.test.jmx;
  2.  
  3. public class HelloWorld implements HelloWorldMBean {
  4.  
  5. private String name;
  6.  
  7. public String getName() {
  8. return name;
  9. }
  10.  
  11. public void setName(String name) {
  12. this.name = name;
  13. }
  14.  
  15. public void printHello() {
  16. System.out.println("Hello World, " + name);
  17. }
  18.  
  19. public void printHello(String whoName) {
  20. System.out.println("Hello , " + whoName);
  21. }
  22.  
  23. }
3. 创建一个Agent类
Agent其实实现的是类似于Server的功能,他负责把JMX服务绑定到相应的URL,并将我们上面创建的被管理的类绑定到其中,使得外部可以访问。
  1. package study.test.jmx;
  2.  
  3. import java.io.IOException;
  4. import java.rmi.registry.LocateRegistry;
  5. import java.rmi.registry.Registry;
  6.  
  7. import javax.management.InstanceAlreadyExistsException;
  8. import javax.management.MBeanRegistrationException;
  9. import javax.management.MBeanServer;
  10. import javax.management.MBeanServerFactory;
  11. import javax.management.MalformedObjectNameException;
  12. import javax.management.NotCompliantMBeanException;
  13. import javax.management.ObjectName;
  14. import javax.management.remote.JMXConnectorServer;
  15. import javax.management.remote.JMXConnectorServerFactory;
  16. import javax.management.remote.JMXServiceURL;
  17.  
  18. import com.sun.jdmk.comm.HtmlAdaptorServer;
  19.  
  20. public class HelloWorldAgent {
  21.  
  22. public static void main(String[] args) throws MalformedObjectNameException,
  23. NullPointerException, InstanceAlreadyExistsException,
  24. MBeanRegistrationException, NotCompliantMBeanException, IOException {
  25.  
  26. int rmiPort = 1099;
  27. String jmxServerName = "TestJMXServer";
  28.  
  29. // jdkfolder/bin/rmiregistry.exe 9999
  30. Registry registry = LocateRegistry.createRegistry(rmiPort);
  31.  
  32. MBeanServer mbs = MBeanServerFactory.createMBeanServer(jmxServerName);
  33. //MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();该方法会将服务器上所有的MBean暴露出来
  34.  
  35. HtmlAdaptorServer adapter = new HtmlAdaptorServer();
  36. ObjectName adapterName;
  37. adapterName = new ObjectName(jmxServerName + ":name=" + "htmladapter");
  38. adapter.setPort(8082);
  39. adapter.start();
  40. mbs.registerMBean(adapter, adapterName);
  41.  
  42. ObjectName objName = new ObjectName(jmxServerName + ":name=" + "HelloWorld");
  43. mbs.registerMBean(new HelloWorld(), objName);
  44.  
  45. JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:" + rmiPort + "/" + jmxServerName);
  46. System.out.println("JMXServiceURL: " + url.toString());
  47. JMXConnectorServer jmxConnServer = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);
  48. jmxConnServer.start();
  49.  
  50. }
  51. }
说明:
1. Agent实现中的35行到40行为MBeanServer添加了一个htmladapter,这样我们就可以通过网页的方式来进行管理。
 比如说上面我们实行的Agent,我们就可以通过http://localhost:8082来对程序进行管理。这里的8082就是htmladapter中设置的端口。
通过我们设定的MBean名字点击去,就可以进一步来管理我们的MBean
 从这张图我们可以看出,我们可以直接从网页上面来改动Name的值,并且也可以直接通过点击来调用相应的方法:printHello
 
 
 2. 如果大家在尝试写Agent程序时出现connection refused的异常的时候,不用怕,赶紧检查一下你的程序中是不是有这句话:
   Registry registry = LocateRegistry.createRegistry(rmiPort);
   LocateRegistry.createRegistry(int port)方法可以在某一特定端口创建名字服务,从而用户无需再手工启动rmiregistry
   或者,你也可以运行  jdkfolder/bin/rmiregistry.exe 9999
   其中jdkfolder是你的jdk的安装目录,9999是你要绑定的端口
   运行上面的命令和你在代码中添加上面那行code是一样的效果
   
 3. Agent的实现中的32行和33行是两种获取MBeanServer的方式。
    MBeanServer mbs = MBeanServerFactory.createMBeanServer(jmxServerName);
    这种方式主要用于JDK1.5以前
  MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
   这种方式是JDK1.5引入的。
   安全起见,当大家不能确定以后部署的机器上面安装的JDK是1.5以上的版本时,建议按照第一种方式。
   
 4. 绑定需要被管理的类
    ObjectName objName = new ObjectName(jmxServerName + ":name=" + "HelloWorld");
  mbs.registerMBean(new HelloWorld(), objName);
  这里我们可以看到,首先要给被绑定的类起一个名字,然后把这个名字和被管理的类一起注册到MBeanServer当中。
  
5. 将服务绑定到固定的URL上
  JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:" + rmiPort + "/" + jmxServerName);
  JMXConnectorServer jmxConnServer = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);
  jmxConnServer.start();
  在start方法被调用后,服务就已经发布成功,我们就可以通过页面或者其他的方式来访问服务

初识:JMX的更多相关文章

  1. 初识轻量级Java开源框架 --- Spring

    初识轻量级Java开源框架 --- Spring 作者:egg 微博:http://weibo.com/xtfggef 出处:http://blog.csdn.net/zhangerqing spri ...

  2. 初识zookeeper(1)之zookeeper的安装及配置

    初识zookeeper(一)之zookeeper的安装及配置 1.简要介绍 zookeeper是一个分布式的应用程序协调服务,是Hadoop和Hbase的重要组件,是一个树型的目录服务,支持变更推送. ...

  3. Android动画效果之初识Property Animation(属性动画)

    前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Andr ...

  4. 初识Hadoop

    第一部分:              初识Hadoop 一.             谁说大象不能跳舞 业务数据越来越多,用关系型数据库来存储和处理数据越来越感觉吃力,一个查询或者一个导出,要执行很长 ...

  5. python学习笔记(基础四:模块初识、pyc和PyCodeObject是什么)

    一.模块初识(一) 模块,也叫库.库有标准库第三方库. 注意事项:文件名不能和导入的模块名相同 1. sys模块 import sys print(sys.path) #打印环境变量 print(sy ...

  6. 初识IOS,Label控件的应用。

    初识IOS,Label控件的应用. // // ViewController.m // Gua.test // // Created by 郭美男 on 16/5/31. // Copyright © ...

  7. UI篇(初识君面)

    我们的APP要想吸引用户,就要把UI(脸蛋)搞漂亮一点.毕竟好的外貌是增进人际关系的第一步,我们程序员看到一个APP时,第一眼就是看这个软件的功能,不去关心界面是否漂亮,看到好的程序会说"我 ...

  8. Python导出Excel为Lua/Json/Xml实例教程(一):初识Python

    Python导出Excel为Lua/Json/Xml实例教程(一):初识Python 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出 ...

  9. 初识SpringMvc

    初识SpringMvc springMvc简介:SpringMVC也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的 s ...

随机推荐

  1. VisualStudio: Vistual Studio XML 智能提示(转载)

    原文地址:http://blog.csdn.net/hispring/article/details/5332312. 开发中经常遇到要和各种各样的 XML 打交道,编辑 XML 文件时最头痛的便是要 ...

  2. 用FadingActionBar实现有头图的ActionBar

         FadingActionBar这个开源项目在社区上很火,感觉Google I/O 2014中就有它的身影.今天我们来介绍下这个实用的开源项目. 首先是到这里(https://github.c ...

  3. SearchView的最简单的使用方式

    SearchView顾名思义就是一个搜索视图,和之前讲解的自动匹配的输入框类似.只不过他有自己特有的监听器,并且可以实时得到用户输入的结果.对于SearchView这个控件,我强烈建议将其放在Acti ...

  4. anaconda、pip配置国内镜像

    一.anaconda配置镜像查看源:conda config --show-sources在Mac and Linux下:conda config --add channels https://mir ...

  5. 《成神之路-基础篇》JVM——Java内存模型(已完结)

    Java内存模型 本文是<成神之路系列文章>的第一篇,主要是关于JVM的一些介绍. 持续更新中 Java内存模型 JVM内存结构 VS Java内存模型 VS Java对象模型(Holli ...

  6. [转]五种常见的 PHP 设计模式

    FROM : http://www.ibm.com/developerworks/cn/opensource/os-php-designptrns/ 设计模式 一书将设计模式引入软件社区,该书的作者是 ...

  7. CodeReview工具Gerrit的python库pygerrit2

    源代码: https://github.com/dpursehouse/pygerrit2

  8. Error:(13, 60) java: 程序包com.sun.tools.internal.xjc.reader.xmlschema.bindinfo不存在

    我在import maven项目时,pom.xml报错Missing artifact com.sun:tools:jar:1.5.0,经过盘查发现是pom引入的struts2相关jar包导致报错. ...

  9. SQL Server 2005 分区表实践——分区切换

    本文演示了 SQL Server 2005 分区表分区切换的三种形式: 1. 切换分区表的一个分区到普通数据表中:Partition to Table: 2. 切换普通表数据到分区表的一个分区中:Ta ...

  10. 【转】QT 串口QSerialPort + 解决接收数据不完整问题

    类:QSerialPort 例程:Examples\Qt-5.9.1\serialport\terminal,该例子完美展示了qt串口收发过程,直接在这上面修改就可以得到自己的串口软件.核心方法 // ...