JBOSS 启动过程
2009-06-24 15:12
190 查看
JBoss启动过程跟踪JBoss启动过程简介 JBoss 的基本框架是JMX,JBoss的服务基本上是通过注册到一个MBeanServer来实现的,因此具有很好的扩展性,好像Weblogic和 AdventNet的基本结构也是基于jmx的。JBoss的服务类大都实现了ServiceMBean接口,在管理上也方便了许多。 环境设置 启动catalina 设置环境变量 JBOSS_CLASSPATH (可以自己加上安全管理器和xml解析器) a) %JBOSS_CLASSPATH%; b) %JAVA_HOME%/lib/tools.jar; c) run.jar d) ../lib/crimson.jar; 设置启动参数JAXP(xml解析器和相应工厂) e) -Djavax.xml.parsers.DocumentBuilderFactory=org.apache.crimson.jaxp.DocumentBuilderFactoryImpl f) -Djavax.xml.parsers.SAXParserFactory=org.apache.crimson.jaxp.SAXParserFactoryImpl 启动 java %JAXP% -classpath "%JBOSS_CLASSPATH%" org.jboss.Main org.jboss.Main 设置配置信息 String cn = "default"; String patchDir = null; ………… final String confName = cn; final String patchDirName = patchDir; 配置文件放在“/conf/” + confName + “/”下面。对于jboss2.4 + Catalina, 在运行run.bat文件时指定了参数catalina,实际使用的是/conf/catalina目录下的配置文件。 读取配置文件jboss.properties,保存在系统属性中(System.properties) URL jbossProps = Main.class.getClassLoader().getResource (confName+”/jboss.properties”); InputStream propertiesIn = Main.class.getClassLoader().getResourceAsStream (confName+”/jboss.properties”); if ( propertiesIn != null ) { System.getProperties().load(propertiesIn); } 设置缺省属性jboss.home和java.security.auth.login.config if( System.getProperty(“jboss.home”) == null ) { ………… System.setProperty(“jboss.home”, homeDir.getCanonicalPath()); } // Set the JAAS login config file if not already set if( System.getProperty(“java.security.auth.login.config”) == null ) { ………… System.setProperty(“java.security.auth.login.config”, loginConfig.toExternalForm()); } 创建MBeanServer.的实例: final MBeanServer server = MBeanServerFactory.createMBeanServer(); javax.management.MBeanServerFactory中的这个方法是这样实现的: public static MBeanServer createMBeanServer () { MBeanServer mbeanServer = new MBeanServerImpl() ; addMBeanServer(mbeanServer) ; //存储MBeanServer return mbeanServer ; } 1. 这个方法根据缺省的域创建了一个符合MBeanServer接口的实例。 2. 在MBeanServerFactory中有一个静态私有变量 MBeanServerList 用于存储MBeanServer,这样以后查找BeanServer时候可以找到已创建的server。 com.sun.management.jmx.MBeanServerImpl时这样实现的: public MBeanServerImpl() { initialize(new RepositorySupport(), null); } private void initialize(RepositorySupport repository, String domain) { } MBeanServerImpl有一个私有变量repository用于存储MBean initialize函数执行下列动作: 1. 如果domain为null或者是空字符串,将自己的域设置为repository的缺省域 (”DefaultDomain”)。否则将自己和repository的域设置为domain. 2. 设置查询服务的方式,目前的实现是由MBeanServer负责查询 3. 创建MetaData实例(在注册时候检查MBean的接口) 4. 创建标识MBeanServer的MBean: MBeanServerDelegateObject 5. 注册MBeanServerDelegateObject 6. 保存类加载器,包括加载MBeanServerImpl类的加载器和系统类加载器。 把配置文件和补丁文件所在的目录指定给特定的远程类加载器Mlet URL[] urls = {confDirectory}; 获得所有补丁文件 ………… MLet mlet = new NullURLsMLet(urls); NullURLsMLet扩展了Mlet类,并调用父类的构造函数进行初始化。 server.registerMBean(mlet, new ObjectName(server.getDefaultDomain(), “service”, “MLet”)); 把mlet设置为本应用的类加载器 Thread.currentThread().setContextClassLoader(mlet); 加载保存配置文件(mlet会自动在配置文件目录中查找) URL mletConf = mlet.getResource("jboss.conf"); Set beans = (Set)mlet.getMBeansFromURL(mletConf); ………… server.invoke(new ObjectName(":service=Configuration"), "loadConfiguration", new Object[0], new String[0]); server.invoke(new ObjectName(":service=Configuration"), "saveConfiguration", new Object[0] , new String[0]); 初始化并启动MBean server.invoke(new ObjectName(":service=ServiceControl"), "init", new Object[0] , new String[0]); server.invoke(new ObjectName(":service=ServiceControl"), "start", new Object[0] , new String[0]); 配置服务ConfigurationService 加载配置文件 loadConfiguration方法 用DOM读取配置文件 doc = parser.parse(new InputSource(new StringReader(sbufData.toString()))); //创建相应的MBean create(doc); //设置MBean的属性并注册相应的服务 load(doc); create方法 //把配置文件中所指明的MBean加载到server中 NodeList nl = configuration.getElementsByTagName("mbean"); for (int i = 0; i < nl.getLength(); i++) { ………… MBeanInfo info; try { info = server.getMBeanInfo(objectName); } catch (InstanceNotFoundException e) { ………… //创建MBean server.createMBean(code,objectName,loader, constructor.params, constructor.signature); info = server.getMBeanInfo(instance.getObjectName()); ………… } } load方法 设置相应MBean的属性 Object value = attributeText; server.setAttribute(objectName, new Attribute(attributeName, value)); 注册服务 registerService(objectName, info, mbeanElement); server.invoke(serviceControl, "register", args, signature); 保存配置 saveConfiguration方法 将MBeanServer中注册的MBean的信息写入jboss-auto.jcml文件中 服务控制ServiceControl ServiceControl被用来管理JBoss服务的生命周期 初始化服务程序(init方法) 在 配置服务的时候,ConfigurationService.load方法调用serviceControl.register方法注册了很多 MBean,这些MBean都是Service的子类,即他们都有自己的init, start, stop, destroy方法。 ServiceControl的init方法简单的调用所有已注册的MBean的init方法来完成初始化。 启动服务程序(start方法) ServiceControl的start方法简单的调用所有已注册的MBean的start方法来完成启动。 配置过程中所加载的类 DefaultDomain:service=Webserver:org.jboss.web.WebService JNDI DefaultDomain:service=Naming:org.jboss.naming.NamingService DefaultDomain:service=JNDIView:org.jboss.naming.JNDIView Transactions DefaultDomain:service=TransactionManager: org.jboss.tm.TransactionManagerService org.jboss.tm.plugins.tyrex.TransactionManagerService DefaultDomain:service=ClientUserTransaction:org.jboss.tm.usertx.server.ClientUserTransactionService Security DefaultDomain:service=JaasSecurityManager:org.jboss.security.plugins.JaasSecurityManagerService JDBC DefaultDomain:service=JdbcProvider:org.jboss.jdbc.JdbcProvider DefaultDomain:service=Hypersonic:org.jboss.jdbc.HypersonicDatabase XADataSource:service=DefaultDS:org.jboss.jdbc.XADataSourceLoader JBoss Server Management Management:service=Collector:org.jboss.management.ServerDataCollector J2EE deployment :service=ContainerFactory:org.jboss.ejb.ContainerFactory DefaultDomain:service=EmbeddedTomcat: org.jboss.web.catalina.EmbeddedCatalinaServiceSX DefaultDomain:service=Jetty: JBossMQ JBossMQ:service=Server: org.jboss.mq.server.JBossMQService JBossMQ:service=StateManager: org.jboss.mq.server.StateManager JBossMQ:service=PersistenceManager: org.jboss.mq.pm.rollinglogged.PersistenceManager JBossMQ:service=InvocationLayer,type=JVM: org.jboss.mq.il.jvm.JVMServerILService JBossMQ:service=InvocationLayer,type=RMI: org.jboss.mq.il.rmi.RMIServerILService JBossMQ:service=InvocationLayer,type=OIL: org.jboss.mq.il.oil.OILServerILService JBossMQ:service=InvocationLayer,type=UIL: org.jboss.mq.il.uil.UILServerILService JBossMQ:service=Topic,name=testTopic: org.jboss.mq.server.TopicManager JBossMQ:service=Topic,name=example: org.jboss.mq.server.TopicManager JBossMQ:service=Topic,name=bob: org.jboss.mq.server.TopicManager JBossMQ:service=Queue,name=DLQ: org.jboss.mq.server.QueueManager JBossMQ:service=Queue,name=testQueue: org.jboss.mq.server.QueueManager JBossMQ:service=Queue,name=controlQueue: org.jboss.mq.server.QueueManager JBossMQ:service=Queue,name=A: org.jboss.mq.server.QueueManager JBossMQ:service=Queue,name=B: org.jboss.mq.server.QueueManager JBossMQ:service=Queue,name=C: org.jboss.mq.server.QueueManager JBossMQ:service=Queue,name=D: org.jboss.mq.server.QueueManager JBossMQ:service=Queue,name=E: org.jboss.mq.server.QueueManager JBossMQ:service=Queue,name=F: org.jboss.mq.server.QueueManager JBossMQ:service=Queue,name=ex: org.jboss.mq.server.QueueManager 为了向后兼容所引入的MBean DefaultDomain:service=NamingAlias,fromName=QueueConnectionFactory: org.jboss.naming.NamingAlias DefaultDomain:service=NamingAlias,fromName=TopicConnectionFactory: org.jboss.naming.NamingAlias 消息驱动MBean :service=JMSProviderLoader,name=JBossMQProvider org.jboss.jms.jndi.JMSProviderLoader :service=ServerSessionPoolMBean,name=StdJMSPool: org.jboss.jms.asf.ServerSessionPoolLoader J2eeDeployer J2EE:service=J2eeDeployer: org.jboss.deployment.J2eeDeployer J2EE:service=J2eeDeployer(optional): org.jboss.deployment.scope.J2eeGlobalScopeDeployer JBossCX setup, for J2EE connector architecture support JCA:service=RARDeployer: org.jboss.resource.RARDeployer JCA:service=ConnectionManagerFactoryLoader,name=MinervaNoTransCMFactory: org.jboss.resource.ConnectionManagerFactoryLoader JCA:service=ConnectionManagerFactoryLoader,name=MinervaSharedLocalCMFactory: org.jboss.resource.ConnectionManagerFactoryLoader JCA:service=ConnectionManagerFactoryLoader,name=MinervaXACMFactory: org.jboss.resource.ConnectionManagerFactoryLoader JCA:service=ConnectionFactoryLoader,name=MinervaDS: org.jboss.resource.ConnectionFactoryLoader resource adapter example DefaultDomain:service=RawXADataSourceLoader,name=MinervaXADS org.jboss.jdbc.RawXADataSourceLoader JCA:service=ConnectionFactoryLoader,name=XAMinervaDS: org.jboss.resource.ConnectionFactoryLoader JMS XA Resource adapter JCA:service=ConnectionFactoryLoader,name=JmsXA: org.jboss.resource.ConnectionFactoryLoader Auto deployment EJB:service=AutoDeployer: org.jboss.ejb.AutoDeployer Adaptor:name=RMI org.jboss.jmx.server.JMXAdaptorService Connector:name=RMI: org.jboss.jmx.server.RMIConnectorService Adaptor:name=html: com.sun.jdmk.comm.HtmlAdaptorServer Mail Connection Factory :service=Mail org.jboss.mail.MailService Monitor:name=BeanCacheMonitor: org.jboss.monitor.BeanCacheMonitor Scheduler Service :service=Scheduler: org.jboss.util.Scheduler 附录A com.sun. management.jmx.MBeanServerImpl registerMBean方法 检查是否符合MBean规范(参考JMX笔记内省算法) meta.testCompliance(theClass); 如果对象实现了MBeanRegistration接口,调用其preRegisterInvoker方法 if (object instanceof MBeanRegistration) { res=preRegisterInvoker(object,name); } 把对象加入池中 internal_addObject(object, logicalName); 如果对象实现了MBeanRegistration接口,调用其postRegisterInvoker方法 if (object instanceof MBeanRegistration) postRegisterInvoker(object, true); 如果新注册的MBean是一个类加载器,把它加在加载器池中 if (object instanceof ClassLoader) { DefaultLoaderRepository.addClassLoader((ClassLoader)object); } 如果是动态MBean,获取其MBeanInfo和ClassName MBeanInfo mbi = ((DynamicMBean)object).getMBeanInfo(); className = mbi.getClassName(); 返回ObjectInstance对象以供使用 return(new ObjectInstance(logicalName, className)); invoke方法 public Object invoke(ObjectName name, String operationName, Object params[], String signature[]) throws InstanceNotFoundException, MBeanException, ReflectionException; 取得MBean对象的实例 Object obj = getMBean(name); 取得MBean的接口 Class mbeanClass = meta.getMBeanInterface(instance.getClass()); 在注册时曾经用meta检查对象的接口,在检查的时候,meta把对象的MBeanInterface保存在自己的mbeanInterfaceCache中,现在可以从中取回。如果对象是DynamicMBean,则meta不会保存,返回null。 用指定的类装载器重新装载参数 Class primCla = meta.findClassForPrim(signature); params= transferObject(params, aloader); 查找将要启动的方法 Method mth= meta.findMethod(mbeanClass, operationName, tab); 启动方法 result= mth.invoke(instance, params); |
---|
相关文章推荐
- Solaris10系统下普通用户无法启动jboss解决过程
- 深入理解 JBoss 7/WildFly Standalone 模式启动过程
- JBoss启动过程
- JBOSS启动过程
- JBOSS 启动 加载 过程
- JBoss启动过程
- JBoss Application Server的启动过程
- JBOSS 启动 加载 过程
- JBoss启动过程
- 深入理解 JBoss 7/WildFly Domain 模式启动过程
- 深入理解 JBoss 7/WildFly Domain 模式启动过程
- jboss启动过程
- jboss之启动加载过程详解(-)
- jboss之启动加载过程详解
- jboss的启动过程
- JBoss启动过程详解
- 深入理解 JBoss 7/WildFly Standalone 模式启动过程
- JBoss AS 6.1.0 Final 启动过程分析-Main
- jboss之启动加载过程详解(二)
- jboss的启动过程