1 Mean是个啥
能看到Druid代码中定义了大量的MBean对象,如DruidAbstractDataSourceMBean等等,主要是用来管理和监控系统资源的,一般会包含如下信息:
- 应用程序配置信息
- 模块信息
- 系统信息
- 统计信息等
MBean 也可以设立可读写的属性、直接操作某些函数甚至启动 MBean 可发送的 notification 等。
可以在Jconsole等工具中方便地查看Mbean的信息
2 Druid中的Mbean
druid是自己实现的MBean的管理,在DataSource的init() 和close()中分别调用了registerMbean()和unregisterMbean()
注册时,调用了DruidDataSourceStatManager中的addDataSource()方法,
public synchronized static ObjectName addDataSource(Object dataSource, String name) {
final Map<Object, ObjectName> instances = getInstances();
MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
synchronized (instances) {
if (instances.size() == 0) {
try {
ObjectName objectName = new ObjectName(MBEAN_NAME);
if (!mbeanServer.isRegistered(objectName)) {
mbeanServer.registerMBean(instance, objectName);
}
} catch (JMException ex) {
LOG.error("register mbean error", ex);
}
DruidStatService.registerMBean();
}
}
ObjectName objectName = null;
if (name != null) {
try {
objectName = new ObjectName("com.alibaba.druid:type=DruidDataSource,id=" + name);
mbeanServer.registerMBean(dataSource, objectName);
} catch (Throwable ex) {
LOG.error("register mbean error", ex);
objectName = null;
}
}
if (objectName == null) {
try {
int id = System.identityHashCode(dataSource);
objectName = new ObjectName("com.alibaba.druid:type=DruidDataSource,id=" + id);
mbeanServer.registerMBean(dataSource, objectName);
} catch (Throwable ex) {
LOG.error("register mbean error", ex);
objectName = null;
}
}
instances.put(dataSource, objectName);
return objectName;
}
synchronized 锁是为了保证在注册DataSourceMbean先注册上DruidDataSourceStat的Mbean,还有DruidStatService的Mbean,之后注册当前DataSource的Mbean,在objectName的生成上运用了一些策略。
注册动作在每次init方法调用的时候都会执行,不用像JMX那样侵入式的创建了,这种方式在编写框架、基础组件时还是比较优雅的。之后工程中有简单的监控需求时,值得借鉴。
MBean的扩展阅读:
https://www.jianshu.com/p/6aff920def9b
https://www.liaoxuefeng.com/wiki/1252599548343744/1282385687609378
https://docs.oracle.com/javase/tutorial/jmx/mbeans/index.html
网友评论