zoukankan      html  css  js  c++  java
  • 初识:JMX

    来自: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字样。
    package study.test.jmx;
    
    public interface HelloWorldMBean {
        public String getName();        
        public void setName(String name);    
        public void printHello();       
        public void printHello(String whoName);  
    }
    2. 被管理的类
    被管理的类需要实现相应的MBean接口,通过MBean接口中的方法来被管理。
    package study.test.jmx;
    
    public class HelloWorld implements HelloWorldMBean {
        
        private String name;    
        
        public String getName() {    
            return name;    
        }    
       
        public void setName(String name) {    
            this.name = name;    
        }    
       
        public void printHello() {    
            System.out.println("Hello World, " + name);    
        }    
       
        public void printHello(String whoName) {    
            System.out.println("Hello , " + whoName);    
        }    
    
    }
    3. 创建一个Agent类
    Agent其实实现的是类似于Server的功能,他负责把JMX服务绑定到相应的URL,并将我们上面创建的被管理的类绑定到其中,使得外部可以访问。
    package study.test.jmx;
    
    import java.io.IOException;
    import java.rmi.registry.LocateRegistry;
    import java.rmi.registry.Registry;
    
    import javax.management.InstanceAlreadyExistsException;
    import javax.management.MBeanRegistrationException;
    import javax.management.MBeanServer;
    import javax.management.MBeanServerFactory;
    import javax.management.MalformedObjectNameException;
    import javax.management.NotCompliantMBeanException;
    import javax.management.ObjectName;
    import javax.management.remote.JMXConnectorServer;
    import javax.management.remote.JMXConnectorServerFactory;
    import javax.management.remote.JMXServiceURL;
    
    import com.sun.jdmk.comm.HtmlAdaptorServer;
    
    public class HelloWorldAgent {
    
        public static void main(String[] args) throws MalformedObjectNameException,
                NullPointerException, InstanceAlreadyExistsException,
                MBeanRegistrationException, NotCompliantMBeanException, IOException {
    
            int rmiPort = 1099;
            String jmxServerName = "TestJMXServer";
            
            // jdkfolder/bin/rmiregistry.exe 9999        
            Registry registry = LocateRegistry.createRegistry(rmiPort);
    
            MBeanServer mbs = MBeanServerFactory.createMBeanServer(jmxServerName);
            //MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();该方法会将服务器上所有的MBean暴露出来
        
            HtmlAdaptorServer adapter = new HtmlAdaptorServer();
            ObjectName adapterName;
            adapterName = new ObjectName(jmxServerName + ":name=" + "htmladapter");
            adapter.setPort(8082);
            adapter.start();
            mbs.registerMBean(adapter, adapterName);
    
            ObjectName objName = new ObjectName(jmxServerName + ":name=" + "HelloWorld");
            mbs.registerMBean(new HelloWorld(), objName);
            
    
            JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:" + rmiPort + "/" + jmxServerName);
            System.out.println("JMXServiceURL: " + url.toString());
            JMXConnectorServer jmxConnServer = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);
            jmxConnServer.start();
    
        }
    }
    说明:
    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方法被调用后,服务就已经发布成功,我们就可以通过页面或者其他的方式来访问服务
  • 相关阅读:
    axis2 WebService的发布与调用
    sql语句having子句用法,很多时候你曾忘掉
    linux下tomcat开机自启动
    框架使用的技术主要是SpringMVC 在此基础上进行扩展
    SpringMVC整合Mongodb开发 架构搭建
    解决Linux下3T硬盘分区只有2T(2199G)可用
    ubuntu cp(copy) command
    Linux如何根据UUID自动挂载磁盘分区
    python exec和eval
    在OpenERP报表中使用selection 类型字段
  • 原文地址:https://www.cnblogs.com/sunxucool/p/3913990.html
Copyright © 2011-2022 走看看