本章讲述一个种特殊的MBean,称为MXBean。
通过MXBean,JMX客户端不需要做特殊的配置即可处理预定义的数据类型。
与MBean一样,MXBean同样需要定义一个接口和一个实现类,不同的是接口以MXBean作为后缀,且类名和接口名不必相同。MXBean的接口还可以通过@MXBean注解定义,这样接口名就不需要MXBean后缀了。
MXBean背后的原理:通过把预定义类型映射到一组标准类型,即在包javax.management.openmbe中定义的所谓开放类型,来保证MXBean在所有客户端都可用。MXBean规范定义了映射规则,简单来说就是,私有数据类型不变,复杂类型映射到CompositeDataSupport。
举例说明MXBean的实现
- 下面的例子通过定义一个MXBean类管理Queue<String>资源
- MXBean定义了一个getQueueSample方法用于获取队列的快照,并且返回一个QueueSample封装类,QueueSample包含下面的信息:
- 快照获取的时间
- 队列的尺寸
- 对头
接口定义
package com.example;
public interface QueueSamplerMXBean {
public QueueSample getQueueSample();
public void clearQueue();
}
类定义
package com.example;
import java.util.Date;
import java.util.Queue;
public class QueueSampler
implements QueueSamplerMXBean {
private Queue<String> queue;
public QueueSampler (Queue<String> queue) {
this.queue = queue;
}
public QueueSample getQueueSample() {
synchronized (queue) {
return new QueueSample(new Date(),
queue.size(), queue.peek());
}
}
public void clearQueue() {
synchronized (queue) {
queue.clear();
}
}
}
定义MXBean接口返回的类型
package com.example;
import java.beans.ConstructorProperties;
import java.util.Date;
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;
}
public Date getDate() {
return date;
}
public int getSize() {
return size;
}
public String getHead() {
return head;
}
}
注册
package com.example;
import java.lang.management.ManagementFactory;
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
import javax.management.MBeanServer;
import javax.management.ObjectName;
public class Main {
public static void main(String[] args) throws Exception {
MBeanServer mbs =
ManagementFactory.getPlatformMBeanServer();
...
ObjectName mxbeanName = new ObjectName("com.example:type=QueueSampler");
Queue<String> queue = new ArrayBlockingQueue<String>(10);
queue.add("Request-1");
queue.add("Request-2");
queue.add("Request-3");
QueueSampler mxbean = new QueueSampler(queue);
mbs.registerMBean(mxbean, mxbeanName);
System.out.println("Waiting...");
Thread.sleep(Long.MAX_VALUE);
}
}
运行和测试
知识链
备注
- 本文程序片段从Java Platform Standard Edition 8 Documentation文档中摘录
参考
- Java Platform Standard Edition 8 Documentation