bobpipi 2011-03-11
Server的中的初始化基本核心在StandardServer中,下面的代码
protected void initInternal() throws LifecycleException { super .initInternal(); // Register global String cache // Note although the cache is global, if there are multiple Servers // present in the JVM (may happen when embedding) then the same cache // will be registered under multiple names onameStringCache = register(new StringCache(), "type=StringCache" ); // Register the MBeanFactory onameMBeanFactory = register(new MBeanFactory(), "type=MBeanFactory" ); // Register the naming resources onameNamingResoucres = register(globalNamingResources, "type=NamingResources" ); // Initialize our defined Services for ( int i = 0 ; i < services.length; i++) { services[i].init(); } }
protected void initInternal() throws LifecycleException { super.initInternal(); // Register global String cache // Note although the cache is global, if there are multiple Servers // present in the JVM (may happen when embedding) then the same cache // will be registered under multiple names onameStringCache = register(new StringCache(), "type=StringCache"); // Register the MBeanFactory onameMBeanFactory = register(new MBeanFactory(), "type=MBeanFactory"); // Register the naming resources onameNamingResoucres = register(globalNamingResources, "type=NamingResources"); // Initialize our defined Services for (int i = 0; i < services.length; i++) { services[i].init(); } }
先看super.initInternal();
protected void initInternal() throws LifecycleException { // If oname is not null then registration has already happened via // preRegister(). if (oname == null ) { mserver = Registry.getRegistry(null , null ).getMBeanServer(); oname = register(this , getObjectNameKeyProperties()); } }
protected void initInternal() throws LifecycleException { // If oname is not null then registration has already happened via // preRegister(). if (oname == null) { mserver = Registry.getRegistry(null, null).getMBeanServer(); oname = register(this, getObjectNameKeyProperties()); } }
看来问题的关键就在register这个函数了。
protected final ObjectName register(Object obj, String objectNameKeyProperties) { // Construct an object name with the right domain StringBuilder name = new StringBuilder(getDomain()); name.append(':' ); name.append(objectNameKeyProperties); ObjectName on = null ; try { on = new ObjectName(name.toString()); Registry.getRegistry(null , null ).registerComponent(obj, on, null ); } catch (MalformedObjectNameException e) { log.warn(sm.getString("lifecycleMBeanBase.registerFail" , obj, name), e); } catch (Exception e) { log.warn(sm.getString("lifecycleMBeanBase.registerFail" , obj, name), e); } return on; }
protected final ObjectName register(Object obj, String objectNameKeyProperties) { // Construct an object name with the right domain StringBuilder name = new StringBuilder(getDomain()); name.append(':'); name.append(objectNameKeyProperties); ObjectName on = null; try { on = new ObjectName(name.toString()); Registry.getRegistry(null, null).registerComponent(obj, on, null); } catch (MalformedObjectNameException e) { log.warn(sm.getString("lifecycleMBeanBase.registerFail", obj, name), e); } catch (Exception e) { log.warn(sm.getString("lifecycleMBeanBase.registerFail", obj, name), e); } return on; }
接下去看registerComponent函数
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; } }
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; } }
终于知道这一段代码要完成什么功能了,原来register就是将参数中的object注册到MBeanServer中去,而且使用的是DynamicMBean。
Tomcat中
BaseModelMBean实现了DynamicMBean接口,是真正意思上的动态Mbeans。
ManagedBean是对MBeans的管理,例如生产Mbean等。
Registry是又一层次的封装,是将Object(Mbeans)注册到MBeanServer的一个接口,同时还提供对已有Mbeans的查找,防止重复注册等。
说到这里,如果不了解MBean的话,肯定不知道在说什么。所以我下一个续,先从简单的Standard MBeans说起。