JMX快速认知
一、介绍
JMX名词解释Java Management Extensions,即Java管理扩展。
能做什么
管理应用、查看设备信息、查看应用资源、监听资源变化
调用方面
支持跨平台、多协议(soap、http、html、snmp、jconsole)
二、历史变迁
起草时间 | JSR编号 | 主题 | 描述 | 是否启用 | 状态 | 原因 | 提交方 |
---|---|---|---|---|---|---|---|
14 Dec, 1998 | 3 | JMX 1.1和1.2 | 制定JMX规范,为Web、分布式、动态性和模块化方案等,提供管理体系架构 | 是 | 撤销 | 在Java 5.2版本成为了Oracle公司商标 | Sun MicrosystemsConsumer & EmbeddedEmbedded System Software Group |
30 May,2000 | 70 | JMX 适配IIOP协议 | 规范建立基于IIOP协议的适配器,以支持CORBA客户端访问JMX代理 | 否 | 撤销 | 企业战略调整,不看好JMX在CORBA客户端的应用 | IONA Technologies PlcBen Beazley |
27 Jun, 2000 | 71 | JMX-TMN定义 | 规范电信管理网络(TMN)和JMX之间的互操作性 | 否 | 撤销 | 应规范负责人要求撤回,JSR3中已提及这块支持,只是一直没实现 | Bull S.A. (BullSoft) |
21 Aug, 2001 | 146 | JMX 支持WBem服务 | 定义对于WBEM 服务提供协议适配器 | 否 | 撤销 | JSR48 WBEN规范服务,由WBEN Solutions, Inc.提出。两家公司在提出此规范,一年半以后,合作停止 | Sun Microsystems, Inc. |
27 Nov, 2001 | 160 | JMX 远程调用API | 该API扩展了JMX1.2API,提供对JMX MBean服务器的远程访问。 | 是 | 撤销 | 与jsr3相同原因 | Sun Microsystems,Inc. |
21 Sep, 2004 | 255 | JMX 2.0 | 更新JMX和JMX远程 API。改善现有功能可用性并添加新功能。 | 否 | 撤销 | 企业战略调整 | Sun Microsystems,Inc. |
07 Dec, 2004 | 262 | JMX 支持Web Services连接 | 定义JMX支持Web Services支持非Java客户端。 | 是 | 撤销 | 企业战略调整 | Sun Microsystems,Inc. |
可以看出JMX技术完全由Sun公司主导,被收购后没有新的规范被提出。实际被启用的只有sun公司所提交的3、160、262。
三、代码示例
具体地管理应用、查看设备信息、查看应用资源、监听资源变化,这些怎么实现的呢?
定义接口
//接口名必须以MBean结尾
public interface HelloMBean {
String getName();
void setName(String name);
void printHello();
}
实现类
//类名必须和接口MBean前的内容相同,即类名+MBean必须等于接口名
public class Hello extends NotificationBroadcasterSupport implements HelloMBean {
private AtomicLong sequenceNumber = new AtomicLong(1);
private String name;
@Override
public void printHello() {
System.out.println("你好," + name);
}
@Override
public String getName() {
return name;
}
@Override
public void setName(String name) {
String oldName = this.name;
this.name = name;
//通知方法
Notification notification = new AttributeChangeNotification(this,
sequenceNumber.getAndIncrement(),
System.currentTimeMillis(),
AttributeChangeNotification.ATTRIBUTE_CHANGE,
"Name Change",
"java.lang.String",
oldName + "",
this.name + "");
super.sendNotification(notification);
}
}
Main方法
public class StandardMBeanMain {
public static void main(String[] args) throws Exception {
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
ObjectName objName = new ObjectName("MBeanTest2:type=StandardMBean");
mBeanServer.registerMBean(new Hello(), objName);
mBeanServer.addNotificationListener(objName, new HelloListener(), null, null);
Thread.sleep(60 * 60 * 1000);
}
}
监听类
public class HelloListener implements NotificationListener {
@Override
public void handleNotification(Notification notification, Object handback) {
log("SequenceNumber:" + notification.getSequenceNumber());
log("Type:" + notification.getType());
log("Message:" + notification.getMessage());
log("Source:" + notification.getSource());
log("TimeStamp:" + notification.getTimeStamp());
log("UserData:" + notification.getUserData());
log("oldValue:" + ((AttributeChangeNotification)notification).getOldValue());
log("newValue" + ((AttributeChangeNotification)notification).getNewValue());
log("attributeName:" + ((AttributeChangeNotification)notification).getAttributeName());
log("=========" + notification.toString());
}
private void log(String message) {
System.out.println(message);
}
}
jconsole连接示例
ObjectName("MBeanTest2:type=StandardMBean")
查看bean属性信息,同时通过set方法支持修改bean属性
操作支持调用void方法
监听Notification
声明内容
四、Tomcat中jmx的实现逻辑
tomcat中所有组件都实现了Lifecycle接口,管理组件的加载、初始化、启动、关闭等生命周期。
在LifecycleMBeanBase抽象类中有抽象方法getObjectName,由各个组件实现以支持不同的监控项名称查询路由。
在LifecycleMBeanBase抽象类中initInternal方法,把各个子类的MBean注册到MBeanServer中。
至于后面的监听,则可以从本文提供的jconsole示例来管理、查看这些MBean。
引用
https://www.jcp.org/en/jsr/detail?id=3
https://www.jcp.org/en/jsr/detail?id=70
https://www.jcp.org/en/jsr/detail?id=71
https://www.jcp.org/en/jsr/detail?id=146
https://www.jcp.org/en/jsr/detail?id=160
https://www.jcp.org/en/jsr/detail?id=255
https://www.jcp.org/en/jsr/detail?id=262
浮生潦草闲愁广,一听啤酒一口尽