jmx——helloWorld

http://www.blogjava.net/hengheng123456789/articles/65690.html    html

         关于jmx的概述,能够参考  JMXjava

       JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX能够跨越一系列异构操做系统平台、系统体系结构网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。(清空缓存、从新加载配置文件、远程调用等)浏览器

 

问题:应用有配置信息,好比服务的IP地址,端口号,链接池等,如何配?缓存

答:

1. 程序初哥通常是写死在程序里,到要改变时就去改程序,而后再编译发布;
2. 程序熟手则通常把这些信息写在一个配置文件里(JAVA通常都是*.properties文件),到要改变时只要改配置文件,但仍是从新启动系统,以便读取配置文件里的新值;
3. 程序好手则会写一个段代码,把配置值缓存起来,系统在读值的时候,先看看配置文件有没有更动。若有更改则重读一遍,不然从缓存里读取值
4. 程序高手则懂得取物为我所用,用JMX!把配置属性集中在一个类,而后写一个叫MBean的东东,再配置一下就轻松搞定了。并且JMX自动提供了一个WEB页面来给你来改变这些配置信息。tomcat

 

jar包网络

一、JDK1.三、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(库)引用中。
二、JDK5.0
  JDK5.0的jre\lib\rt.jar已经包含了jmxri.jar、jmxremote.jar、rmissl.jar三个包的代码。若是你用到jmxtools.jar、jmxremote_optional.jar的类,则须要将这两个类加入到classpath或 Eclipse的项目库引用中。框架

 

访问 http://maven.ibiblio.org/maven/mule/dependencies/jmxri/jmxtools/1.2/dom

下载jmxtools,配置到工程里maven

codeide

/**
 * MBean
 * 包含在MBean中方法都将是能够被管理的。MBean起名是有规范的,就是原类名后加上MBean字样
 */
public interface HelloWorldMBean {
    void setGreeting(String greeting);
    String getGreeting();
    void printGreeting();

    String status();
    void start();
    void stop();

    void printHello(String message);
}

/**
 * 须要被管理的类(普通类)
 */
public class HelloWorld implements HelloWorldMBean {

    private String greeting = null;

    public HelloWorld(String greeting) {
        this.greeting = greeting;
    }

    public HelloWorld() {
        this.greeting = "Hello World! I am Standard MBean";
    }

    @Override
    public void setGreeting(String greeting) {
        this.greeting = greeting;
        System.out.println("setGreeting : " + this.greeting);
    }

    @Override
    public String getGreeting() {
        System.out.println("getGreeting : " + this.greeting);
        return greeting;
    }

    @Override
    public void printGreeting() {
        System.out.println(greeting);
    }

    @Override
    public String status() {
        return greeting;
    }

    @Override
    public void start() {
        //do nothing
    }

    @Override
    public void stop() {
        //do nothing
    }

    @Override
    public void printHello(String message) {
        System.out.println("hi, " + message);
    }
}

public class HelloAgent {

    public static void main(String[] args) throws Exception {
        // 建立一个MBeanServer做为MBean容器,设定MBeanServer的域名为'HelloAgent'
        //MBeanServer mbs = MBeanServerFactory.createMBeanServer("i.love.you");//jconsole看不到
        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();//jconsole看获得
        HelloWorld hello = new HelloWorld();
        /**
         * MBeanServer中注册的每个在MBean组件都有一个惟一的对象名称标识ObjectName,一个ObjectName包含两个部分,
         * 域和属性键值对,格式为 "domain:type=MBeanName ,如“com.jmx.demo:type=Hello",
         * domain和MBeanName能够随意命名
         */
        ObjectName helloName = new ObjectName("HelloAgent:name=helloWorld");
        //注册MBean
        mbs.registerMBean(hello, helloName);
        // 建立一个HTML适配器AdaptorServer,用来和JMX代理交互,HTML适配器提供了使用Web客户端侵入JMX代理的方式。AdaptorServer同时做为MBean注册在MBeanServer里
        ObjectName adapterName = new ObjectName("HelloAgent:name=htmlAdapter");
        HtmlAdaptorServer adapter = new HtmlAdaptorServer();
        //adapter.setPort(9092);
        mbs.registerMBean(adapter, adapterName);
        adapter.start();
        //当使用jconsole时,htmlAdaptorServer做用等价于 Thread.sleep(Integer.MAX_VALUE);
        System.out.println("HelloAgent is running");

    }

}

run main

访问方式 一

浏览器访问 : http://localhost:8082/ ,出现以下:

这种界面和tomcat的控制台 很相似

在搜索框里输入 :  HelloAgent:name=helloWorld ,结果以下

点击 name=helloWorld

 

修改 1 处的值,点击 2 ,控制台会有setter,getter的输出。

点击 3 ,控制台输出 greeting 的值

 

访问方式 二

win + r  ----->  cmd  

netstat -ano|findstr 8082   :   寻找占用8082端口的pid

----->jconsole

意义

在实际系统中咱们能够把name变成决定数库连接池的变量,这样我就能够对系统的运行参数进行实现的监控和配置(管理)。并且也能够对一些方法(如printHello)进行远程调用了。

相关文章
相关标签/搜索