最近在学习Tomcat 的源代码,发现很多地方都用到了MBean来进行管理,自己实践了下,碰到一些问题
1、静态MBean的属性和方法什么情况下可以在jconsle中看到?public class MessageBean implements MessageBeanMBean {
public String provider = "CATTSOFT";
public String msg = ":this is a msg from 44 "+provider;
public void sendMsg() {
System.out.println(this.msg);
} public String getMsg() {
return this.msg;
}}
在jconsole中只能看到msg和sendMsg,这跟 方法和属性 的可见性有关么?2、动态MBean属性和方法的可见性Tomcat中的engine、host和congtext都是在Registry工具类中注册的,我看了下是DynamicMBean,但在jconsole中也不是全都可以看到BaseModelMBean(实现了DynamicMBean、ModelMBeanNotificationBroadcaster)或HostConfig的全部属性和方法
public class BaseModelMBean implements DynamicMBean, MBeanRegistration, ModelMBeanNotificationBroadcaster {...}
//此处param ‘bean’= HostConfig
 public void registerComponent(Object bean, ObjectName oname, String type)
           throws Exception
    {
        if( log.isDebugEnabled() ) {
            log.debug( "Managed= "+ oname);
        }        if( bean ==null ) {
            log.error("Null component " + oname );
            return;
        }        try {
            if( type==null ) {
                type=bean.getClass().getName();
            }            ManagedBean managed = findManagedBean(bean.getClass(), type);            // The real mbean is created and registered
            DynamicMBean mbean = managed.createMBean(bean);            if(  getMBeanServer().isRegistered( oname )) {
                if( log.isDebugEnabled()) {
                    log.debug("Unregistering existing component " + oname );
                }
                getMBeanServer().unregisterMBean( oname );
            }            getMBeanServer().registerMBean( mbean, oname);
        } catch( Exception ex) {
            log.error("Error registering " + oname, ex );
            throw ex;
        }
    }