JMX学习笔记(二)

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

MBean就是一个普通的Java对象,由属性、操作和通知组成,不同的是它必须遵从JMX规范定义的模式。

规范定义一个MBean由一个类和一个接口组成,且接口名由类名和后缀MBean组成,如Somthing SomthingMBean,接口中定义的方法即为MBean的属性和操作,符合getter和setter规范的方法为MBean的属性,除此之外的方法为MBean的操作。

举例说明MBean的实现

接口定义

package com.example; 

public interface HelloMBean { 

	public void sayHello(); 
	public int add(int x, int y); 

	public String getName(); 
 
	public int getCacheSize(); 
	public void setCacheSize(int size); 
} 
  • HelloMbean定义的方法有:sayHello add
  • HelloMbean定义的属性为:Name CacheSize。Name为只读属性;CacheSize即可读也可写。

类定义

package com.example; 

public class Hello implements HelloMBean { 
    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); 
    } 
    ...
     
    private final String name = "Reginald"; 
    private int cacheSize = DEFAULT_CACHE_SIZE; 
    private static final int 
        DEFAULT_CACHE_SIZE = 200; 
}

注册MBean

JMX开发主要任务就是现实MBean,然后注册到MBean Server中。因此,首先要拿到MBean Server才行。通过ManagementFactory.getPlatformMBeanServer()方法可以拿到MBean Server。

package com.example; 

import java.lang.management.*; 
import javax.management.*; 

public class Main { 
 
    public static void main(String[] args) 
        throws Exception { 
     
        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); 
        ObjectName name = new ObjectName("com.example:type=Hello"); 
        Hello mbean = new Hello(); 
        mbs.registerMBean(mbean, name); 
          
        ...
     
        System.out.println("Waiting forever..."); 
        Thread.sleep(Long.MAX_VALUE); 
    } 
} 
  • 通过调用getPlatformMBeanServer()方法获取,如果已经存在MBean Server,则直接返回现成的;否则创建一个。说白了就是一个单例模式。
  • 每一个MBean实例都由一个ObjectName名称唯一标识,ObjectName需要遵循JMX规范,即名称必须由一个域和一组Key-Value组成。

验证

  1. 把我们编写的程序打包,然后在命令窗口中执行,如下:
    执行jar
  2. 打开jmc.exe(在JAVA的安装目录bin下),然后连接到该程序,在MBean浏览器中可以看到属性和操作
    jmc.exe
    jmc.exe
  3. 执行sayHello操作,在命令窗口中打印出了"hello, world"
    sayHello result

知识链

  1. JMX学习笔记(一)

备注

  • 本文程序片段从Java Platform Standard Edition 8 Documentation文档中摘录

参考

  • Java Platform Standard Edition 8 Documentation

猜你喜欢

转载自blog.csdn.net/qq_34017326/article/details/93642903
JMX