MBean示例
1. Standard MBeans
Standard MBean要求定义一个名称以“MBean”结尾的接口及对应的实现,例如“SomethingMBean”接口及“Something”实现类。
示例代码:
/**
* Standard MBean接口
*/
public interface HelloMBean {
public void sayHello();
public int add(int x, int y);
public String getName();
public int getCacheSize();
public void setCacheSize(int size);
}
/**
* Standard MBean实现类
*/
public class Hello implements HelloMBean {
private final String name = "Reginald";
private int cacheSize = DEFAULT_CACHE_SIZE;
private static final int DEFAULT_CACHE_SIZE = 200;
@Override
public void sayHello() {
System.out.println("hello, world");
}
@Override
public int add(int x, int y) {
return x + y;
}
@Override
public String getName() {
return this.name;
}
@Override
public int getCacheSize() {
return this.cacheSize;
}
@Override
public synchronized void setCacheSize(int size) {
this.cacheSize = size;
System.out.println("Cache size now " + this.cacheSize);
}
启动JConsole,打开MBean标签,可以看到StandardMBean的属性和操作:
修改属性或调用方法,可以看到控制台输出:
2. 通知
为发送通知,MBean必须实现接口NotificationBroadcaster或其子接口(如NotificationEmitter),然后创建类javax.management.Notification或其子类(如AttributeChangedNotification)的实例,并传递给NotificationBroadcasterSupport.sendNotification方法。
示例代码:
/**
* Standard MBean with notification
*/
public interface NotifyMBean {
public void sayHello();
public int add(int x, int y);
public String getName();
public int getCacheSize();
public void setCacheSize(int size);
}
/**
* implementation of Standard MBean with notification
*/
public class Notify extends NotificationBroadcasterSupport implements NotifyMBean {
private final String name = "Reginald";
private int cacheSize = DEFAULT_CACHE_SIZE;
private static final int DEFAULT_CACHE_SIZE = 200;
private long sequenceNumber = 1;
@Override
public void sayHello() {
System.out.println("hello, world");
}
@Override
public int add(int x, int y) {
return x + y;
}
@Override
public String getName() {
return this.name;
}
@Override
public int getCacheSize() {
return this.cacheSize;
}
@Override
public synchronized void setCacheSize(int size) {
int oldSize = this.cacheSize;
this.cacheSize = size;
System.out.println("Cache size now " + this.cacheSize);
Notification n =
new AttributeChangeNotification(this,
sequenceNumber++,
System.currentTimeMillis(),
"CacheSize changed",
"CacheSize",
"int",
oldSize,
this.cacheSize);
sendNotification(n);
}
@Override
public MBeanNotificationInfo[] getNotificationInfo() {
String[] types = new String[]{
AttributeChangeNotification.ATTRIBUTE_CHANGE
};
String className = AttributeChangeNotification.class.getName();
String description = "An attribute of this MBean has changed";
MBeanNotificationInfo info = new MBeanNotificationInfo(types, className, description);
return new MBeanNotificationInfo[]{info};
}
}
MBean的实现类继承了NotificationBroadcasterSupport类(该类实现了NotificationBroadcaster接口)。
注意setCacheSize方法中构建的Notification对象及sendNotification方法调用。
getNotificationInfo方法是NotificationBroadcaster接口中声明的,用于返回一个数组,指示此MBean可能发送的每个通知的Java类名和通知类型。
启动JConsole,看到在MBean标签中显示了“通知”节点:
点击右侧的“订阅”按钮,然后修改CacheSize属性,能够获得通知:
注:“用户数据”列为空,是否正常? 构建的Notification对象中的部分信息未显示(如新、旧属性值)。
3. MXBean
MXBean是一种特殊的MBean,它使用的数据类型是预定义(pre-defined)的,可以被所有客户端(包括远程客户端)使用。MXBean由一个以“MXBean”为后缀的接口和一个实现类组成,但不要求接口和实现类的名称对应。接口也可以不添加MXBean后缀,而由@MXBean注解标识。
注:
MXBean中的所谓“预定义”的数据类型实际是自定义的,被封装成CompositeDataSupport对象。
示例代码:
/**
* MXBean接口
*/
public interface QueueSamplerMXBean {
public QueueSample getQueueSample();
public void clearQueue();
}
/**
* MXBean实现
*/
public class QueueSampler implements QueueSamplerMXBean {
private Queue<String> queue;
public QueueSampler(Queue<String> queue) {
this.queue = queue;
}
@Override
public QueueSample getQueueSample() {
synchronized (queue) {
return new QueueSample(new Date(), queue.size(), queue.peek());
}
}
@Override
public void clearQueue() {
synchronized (queue) {
queue.clear();
}
}
}
/**
* MXBean中预定义的数据类型
*/
public class QueueSample {
private final Date date;
private final int size;
private final String head;
@ConstructorProperties({"date", "size", "head"})
public QueueSample(Date date, int size, String head) {
this.date = date;
this.size = size;
this.head = head;
}
...
}
QueueSample类即MXBean的预定义数据类型。
启动JConsole,点击MBean标签,看到MXBean。
注意属性QueueSample的类型为CompositeDataSupport。
双击“属性值”中的“值”列的javax.management.openmbean.CompositeDataSupport,显示详细信息:
进行clearQueue操作后,查看结果:
注:
MBean中的各个属性的名称显示全部是首字母大写(不知什么原因)。
参考资料:
http://download.oracle.com/javase/6/docs/technotes/guides/jmx/tutorial/tutorialTOC.html
to be continued...