1.定义监控接口,以MBean结尾的java接口
形如HelloMBean的形式的java接口
定义的的getXX方法是属性,可以在jmc中观察看到
返回值为void的方法是方法,可以在jmc中观察看到
2.实现以MBean结尾的java接口的实现类
根据StandardBean,必须是Hello这样形式的Java类
注意线程安全,可见性,并发读写属性的值
5.防止重复注册的措施
注册事件处理器,javax.management.MBeanRegistration接口,实现下面的方法
@Override public ObjectName preRegister(MBeanServer server, ObjectName name) throws Exception { if (server != null) { try { if (server.isRegistered(name)) { server.unregisterMBean(name); } } catch (Exception ex) { LOG.warn("DruidDataSource preRegister error", ex); } } return name; }
6.真正的注册操作,可以放在对象的init方法里面
public void registerMbean() { if (!mbeanRegistered) { AccessController.doPrivileged(new PrivilegedAction<Object>() { @Override public Object run() { ObjectName objectName = DruidDataSourceStatManager.addDataSource(DruidDataSource.this, DruidDataSource.this.name); DruidDataSource.this.setObjectName(objectName); DruidDataSource.this.mbeanRegistered = true; return null; } }); } }
7.反注册操作,放在close方法里面
public void unregisterMbean() { if (mbeanRegistered) {
AccessController.doPrivileged(new PrivilegedAction<Object>() { @Override public Object run() { DruidDataSourceStatManager.removeDataSource(DruidDataSource.this); DruidDataSource.this.mbeanRegistered = false; return null; } }); } }
8.引用
这个是什么?javax.naming.Referenceable
/** Instance key */ protected String instanceKey = null; public Reference getReference() throws NamingException { final String className = getClass().getName(); final String factoryName = className + "Factory"; // XXX: not robust Reference ref = new Reference(className, factoryName, null); ref.add(new StringRefAddr("instanceKey", instanceKey)); ref.add(new StringRefAddr("url", this.getUrl())); ref.add(new StringRefAddr("username", this.getUsername())); ref.add(new StringRefAddr("password", this.getPassword())); // TODO ADD OTHER PROPERTIES return ref; }
9.利用jconsole,jmc等方式监控这类对象
可参照阿里巴巴的druid连接池对象的监控管理来做自己的监控管理