本文学习示例参考《Oracle Standard MBeans》


Standard MBeans 的步骤有两步:

  1. 创建接口 SomethingMBean
  2. 创建一个实现 SomethingMBean 的类,类名必须为 Something

创建接口

  1. public interface HelloMBean {
  2. public void sayHello();
  3. public int add(int x, int y);
  4. public String getName();
  5. public int getCacheSize();
  6. public void setCacheSize(int size);
  7. }

这样一个接口定义了可以暴露到外部的属性和允许外部控制的操作

  • 一个 MBean 的属性是由它实现的接口决定的,外部获取/修改资源数据时都是通过调用 MBean 的方法来获取/修改。对于可读的属性,方法名应该为 getAttributeName ( AttributeName 是属性名称,要遵循大驼峰命名法);对于可写的属性,方法名应该为 setAttributeName
  • 接口除了定义属性以外,还能定义操作,即让外部操控内部资源的方法。按规范来说,只要是和属性无关的方法(不带get/set前缀的方法)都属于操作。

就拿上面的 HelloMBean 接口来说,它提供了两个属性:

  • name
  • cacheSize

提供了两个操作方式:

  • sayHello()
  • add()

接口实现

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; 
}

管理资源

public class Main { 
   public static void main(String[] args) throws Exception { 
      // 创建MBeanServer
      MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); 
      // 创建名称
      ObjectName name = new ObjectName("com.example.mbeans:type=Hello"); 
      // 创建Bean
      Hello mbean = new Hello(); 
      // 注册Bean到MBeanServer
      mbs.registerMBean(mbean, name); 
      System.out.println("Waiting forever..."); 
      Thread.sleep(Long.MAX_VALUE); 
   } 
}

运行

接下来就是跑 Main 应用,然后用 jconsole 连接去看 Hello 的数据。
image.png