本文学习示例参考《Oracle Standard MBeans》
搞 Standard MBeans
的步骤有两步:
- 创建接口
SomethingMBean
- 创建一个实现
SomethingMBean
的类,类名必须为Something
创建接口
public interface HelloMBean {
public void sayHello();
public int add(int x, int y);
public String getName();
public int getCacheSize();
public void setCacheSize(int size);
}
这样一个接口定义了可以暴露到外部的属性和允许外部控制的操作:
- 一个
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
的数据。