- 浏览: 208183 次
- 性别:
- 来自: 福建省
文章分类
最新评论
-
c929833623:
...
Mysql JDBC驱动源码分析(Statement,ResultSet的创建)四 -
pythonlord:
顶 很有帮助,感谢楼主,好人一生平安
Mysql JDBC驱动源码分析(加载驱动)一 -
kiaonly:
代码有错误,我戳。
解释器模式(Interpreter)---java与模式(例子) -
wyzxzws:
小鸟学习了!
JAVA编码问题记录 -
xiaotao.2010:
写的不错! 弱弱说一句 建议使用URL二次转码, 这样可以避免 ...
JAVA编码问题记录
一,上面文章完成了对server.xml载入以及解析,现在主要做的是就是对里面所定义的容器进行初始化工作.
查看org.apache.catalina.startup.Catalina#load()
- //StandarServer开始进行实例化
- server.initialize();
默认情况下是org.apache.catalina.core.StandardServer#initialize的初始化....
public void initialize() throws LifecycleException { if (initialized) { log.info(sm.getString("standardServer.initialize.initialized")); return; } //容器周期的通知,这里使用了Adapter,Observer模式,以下文章对其详解 lifecycle.fireLifecycleEvent(INIT_EVENT, null); //已经初始化 initialized = true; if( oname==null ) { try { //使用jmx进行对象管理 oname=new ObjectName( "Catalina:type=Server"); Registry.getRegistry(null, null) .registerComponent(this, oname, null ); } catch (Exception e) { log.error("Error registering ",e); } } // Register global String cache try { ObjectName oname2 = new ObjectName(oname.getDomain() + ":type=StringCache"); Registry.getRegistry(null, null) .registerComponent(new StringCache(), oname2, null ); } catch (Exception e) { log.error("Error registering ",e); } // Initialize our defined Services //按着server.xml里的流程,初始化完server完再初始化StandardService for (int i = 0; i < services.length; i++) { services[i].initialize(); } }
//org.apache.catalina.core.StandardService#initialize() 初始化
/** * Invoke a pre-startup initialization. This is used to allow connectors * to bind to restricted ports under Unix operating environments. */ public void initialize() throws LifecycleException { // Service shouldn't be used with embeded, so it doesn't matter if (initialized) { if(log.isInfoEnabled()) log.info(sm.getString("standardService.initialize.initialized")); return; } initialized = true; if( oname==null ) { try { // Hack - Server should be deprecated... Container engine=this.getContainer(); domain=engine.getName(); oname=new ObjectName(domain + ":type=Service,serviceName="+name); this.controller=oname; Registry.getRegistry(null, null) .registerComponent(this, oname, null); //对线程池的初始化,在消息传递时,如果有server.xml中设置了,就覆盖默认设置 Executor[] executors = findExecutors(); for (int i = 0; i < executors.length; i++) { ObjectName executorObjectName = new ObjectName(domain + ":type=Executor,name=" + executors[i].getName()); Registry.getRegistry(null, null) .registerComponent(executors[i], executorObjectName, null); } } catch (Exception e) { log.error(sm.getString("standardService.register.failed",domain),e); } } if( server==null ) { // Register with the server // HACK: ServerFactory should be removed... ServerFactory.getServer().addService(this); } // Initialize our defined Connectors //往下一级初始化就是connector 两个 如8080 8009 synchronized (connectors) { for (int i = 0; i < connectors.length; i++) { connectors[i].initialize(); } } }
现在进入org.apache.catalina.connector#initialize
/** * Initialize this connector (create ServerSocket here!) */ public void initialize() throws LifecycleException { if (initialized) { if(log.isInfoEnabled()) log.info(sm.getString("coyoteConnector.alreadyInitialized")); return; } this.initialized = true; if( oname == null && (container instanceof StandardEngine)) { try { // we are loaded directly, via API - and no name was given to us StandardEngine cb=(StandardEngine)container; oname = createObjectName(cb.getName(), "Connector"); Registry.getRegistry(null, null) .registerComponent(this, oname, null); controller=oname; } catch (Exception e) { log.error( "Error registering connector ", e); } if(log.isDebugEnabled()) log.debug("Creating name for connector " + oname); } // Initializa adapter //对Adapter的初始化,并把connector设置进去 adapter = new CoyoteAdapter(this); //以下对象在构造函数中已经实例化,把adapter设置进去 protocolHandler.setAdapter(adapter); IntrospectionUtils.setProperty(protocolHandler, "jkHome", System.getProperty("catalina.base")); try { //继续下一步的实现 protocolHandler.init(); } catch (Exception e) { throw new LifecycleException (sm.getString ("coyoteConnector.protocolHandlerInitializationFailed", e)); } }
org.apache.coyote.http11.Http11Protocol(implements ProtocolHandler)#init
public void init() throws Exception { //JIoEndpoint在全局变量中已经实例化,以下为其设置相应的值 endpoint.setName(getName()); endpoint.setHandler(cHandler); // Verify the validity of the configured socket factory try { if (isSSLEnabled()) { sslImplementation = SSLImplementation.getInstance(sslImplementationName); socketFactory = sslImplementation.getServerSocketFactory(); endpoint.setServerSocketFactory(socketFactory); } else if (socketFactoryName != null) { socketFactory = (ServerSocketFactory) Class.forName(socketFactoryName).newInstance(); endpoint.setServerSocketFactory(socketFactory); } } catch (Exception ex) { log.error(sm.getString("http11protocol.socketfactory.initerror"), ex); throw ex; } if (socketFactory!=null) { Iterator<String> attE = attributes.keySet().iterator(); while( attE.hasNext() ) { String key = attE.next(); Object v=attributes.get(key); socketFactory.setAttribute(key, v); } } try { //以上if语句都没有通过执行,直接执行到JIoEndpoint endpoint.init(); } catch (Exception ex) { log.error(sm.getString("http11protocol.endpoint.initerror"), ex); throw ex; } if (log.isInfoEnabled()) log.info(sm.getString("http11protocol.init", getName())); }
org.apache.tomcat.util.net.JIoEndpoint#init 这个类里面对Socket进行了设置,以后每一次通信都从这个类开始
public void init() throws Exception { if (initialized) return; // Initialize thread count defaults for acceptor if (acceptorThreadCount == 0) { acceptorThreadCount = 1; } if (serverSocketFactory == null) { //serverSocketFacotry的创建(工厂模式) serverSocketFactory = ServerSocketFactory.getDefault(); } if (serverSocket == null) { try { if (address == null) { //创建serverSocket serverSocket = serverSocketFactory.createSocket(port, backlog); } else { serverSocket = serverSocketFactory.createSocket(port, backlog, address); } } catch (BindException be) { if (address == null) throw new BindException(be.getMessage() + "<null>:" + port); else throw new BindException(be.getMessage() + " " + address.toString() + ":" + port); } } //if( serverTimeout >= 0 ) // serverSocket.setSoTimeout( serverTimeout ); initialized = true; }
到这里tomcat的初始化工作已经基本完成,接下来进行相应容器的启动处理
发表评论
-
Nginx1.1实现Resin4集群
2011-10-17 17:56 7285一,web服务器小论 以前的公司使用的web服务器是to ... -
Apache实现Tomcat集群
2010-06-08 20:14 1428一,配置介绍 1,linux 2,tomcat6. ... -
Tomcat源码---容器生命周期管理(Lifecycle)一
2010-03-31 11:12 4465一,tomcat中每一个容器 ... -
Tomcat源码---Session的分析一
2010-03-29 11:31 3842一,前面看了大致的tomcat的请求/响应,接下来的文章对to ... -
Tomcat源码---响应处理五
2010-03-25 16:01 1863一,响应工作我们应该从CoyoteAdapter#servic ... -
Tomcat源码---请求处理四(2)
2010-03-25 15:34 1613对以上的StandardWrapperValve#invok ... -
Tomcat源码---请求处理四(1)
2010-03-25 11:08 1642一,现在到了StandardWrapperValve# ... -
Tomcat源码---请求处理三
2010-03-25 10:39 1368一,这一章节主要讲request与response通过管道,阀 ... -
Tomcat源码---请求处理二
2010-03-24 15:04 1841一,经过以上文章(JIoEndpoint$Worker#run ... -
Tomcat源码---请求处理(接收,线程分配)一
2010-03-24 14:34 2826一,在以上文章中tomcat启动已经完毕,接着要做的是消息的请 ... -
Tomcat源码---容器启动六(4)
2010-03-24 11:14 1469现在容器已经启动成功的StanderService#start ... -
Tomcat源码---容器启动六(3)
2010-03-24 10:48 2291一,容器已经启动到部暑文件(webapps),接下去是Stan ... -
Tomcat源码---容器启动六(2)
2010-03-23 16:42 1502super.start()--->org.apach ... -
Tomcat源码---容器启动六(1)
2010-03-22 16:02 1528一,完成了以上的初始化工作,现在进行容器的启动工作由 ... -
Tomcat源码---载入相应的资源及解析四(2)
2010-03-19 16:47 1513一,根据以上文章所讲的对server.xml的解析作下简单的分 ... -
Tomat源码---载入相应的资源及解析四(1)
2010-03-19 16:22 1405一,进行了以上的类包加载后,现在主要的工作是载入server. ... -
Tomcat源码---启动.初始化(加载类包)分析三
2010-03-19 15:37 2225一,启动 Tomcat是从org.apache.catali ... -
Tomcat的简单了解二
2010-03-19 14:40 1836在查看源代码时,在网上找了一系列的文章,在些作详解: ... -
Tomcat中server.xml的配置分析一
2010-03-19 14:07 1818最近查看了tomcat6的源代码,了解了里面的大概 ...
相关推荐
4. **生命周期管理**:在`common`和`shared`目录中,可以看到Tomcat如何管理和控制各个组件的生命周期,包括启动、停止、初始化和销毁等过程。 5. **配置管理**:Tomcat的配置文件通常位于`conf`目录下,源码解析...
5. 初始化Context:每个Context对应一个Web应用。这个阶段会解析Web应用的配置,如`WEB-INF/web.xml`,加载Servlet、Filter、Listener等。 6. 初始化Servlet、Filter和Listener:这些组件是Web应用的核心部分,它们...
5. **Servlet生命周期**:在Eclipse工程中,理解Servlet的初始化、服务、销毁过程,以及如何通过注解或web.xml配置文件来管理Servlet实例。 6. **JSP编译与执行**:Tomcat如何将JSP文件转换为Servlet类并执行,JSP...
Bootstrap负责初始化Tomcat的基本组件,如加载配置文件、创建并启动Catalina容器,以及执行其他必要的初始化任务。当你在Eclipse中设置断点在这个类中时,可以观察和理解Tomcat如何从启动到服务运行的全过程。 在...
1. **Servlet生命周期**:Tomcat如何加载、初始化、服务、销毁Servlet,以及ServletConfig和ServletContext的角色。 2. **线程池管理**:Tomcat如何使用Executor(`Executor`接口和`ThreadPoolExecutor`实现)来...
4. **Servlet生命周期**:Tomcat源码揭示了Servlet的加载、初始化、服务、销毁等生命周期过程。`java/org/apache/catalina/loader/WebappClassLoader`类负责加载Servlet类,`java/org/apache/catalina/core/...
《深入理解Tomcat源码与Servlet-API》 Tomcat,作为Apache软件基金会的顶级项目,是Java Servlet和JavaServer Pages(JSP)的开源Web应用服务器,被广泛应用于中小型企业的Web服务部署。7.0.59版本是Tomcat的一个...
Tomcat中的组件都遵循生命周期接口,包括初始化、启动、停止和销毁四个阶段。这些接口使得开发者可以在各个阶段添加自定义逻辑。 4. **类加载机制** Tomcat使用自定义的类加载器来加载Web应用中的类,以实现不同...
- **Servlet** 和 **JSP** 的生命周期:如何初始化、服务、销毁,以及如何与请求和响应对象交互。 - **Connector** 和 **Engine**:Tomcat如何接收和路由HTTP请求。 - **Context**、**Host** 和 **Wrapper**:这些是...
1. **Catalina**: 这是Tomcat的核心组件,负责处理Servlet和JSP的生命周期管理,包括加载、实例化、初始化、服务和销毁。Catalina提供了基于容器的概念,每个Web应用程序都有一个独立的容器。 2. ** Coyote**: 这是...
这个过程涉及类加载、容器初始化、部署应用等多个步骤。理解这个过程有助于我们进行自定义配置和故障排查。 三、请求处理 当一个HTTP请求到达,Coyote Connector首先接收到请求,然后将其转换为Request和Response...
- Servlet的生命周期包括加载、初始化、服务、销毁四个阶段。Tomcat通过Servlet容器管理这些阶段。 - JSP在首次访问时被编译成Servlet,并经历与Servlet相同的生命周期。 5. **线程池和连接器** Tomcat使用...
5. **生命周期管理**:Tomcat遵循Servlet规范,管理Servlet的加载、初始化、服务、销毁等阶段。每个Servlet都有其生命周期方法,如`init()`, `service()`, `destroy()`。 6. **部署与热部署**:通过`webapps`目录下...
7. **Lifecycle and Manager Interfaces**:定义了组件的生命周期方法,如初始化、启动、停止和销毁,以及Web应用程序的管理接口。 在Eclipse中查看源码,可以帮助开发者: - **定位问题**:当遇到错误或异常时,...
- **Servlet生命周期**:如何加载、初始化、服务和销毁Servlet。 - **JSP编译过程**:JSP如何被转换成Servlet并编译。 - **HTTP协议处理**:Tomcat如何接收和响应HTTP请求。 - **连接器(Connector)架构**:不同的...
4. "Tomcat源码分析(4)容器处理链接之责任链模式.doc":分析了Tomcat如何利用责任链模式来处理请求,使得请求可以被多个处理器(如过滤器)有序处理。 5. "tomcat加载类的顺序.doc":详细说明了Tomcat加载类的具体...
- `org.apache.catalina.startup.Bootstrap`:Tomcat的启动入口,负责加载服务器配置并初始化Catalina。 - `org.apache.catalina.core.StandardServer`:服务器对象,管理其他服务器组件。 - `org.apache....
当Tomcat启动时,首先加载`catalina.sh`或`catalina.bat`脚本,然后初始化服务器配置,加载`server.xml`文件。接着,Catalina创建并启动各个组件,如引擎(Engine)、主机(Host)和上下文(Context),这些是部署...
Tomcat源码中实现了Servlet的生命周期管理,包括加载、初始化、服务、销毁等阶段。`org.apache.catalina.core.StandardWrapper`类负责管理单个Servlet实例的生命周期。 3. **请求处理**: `org.apache.coyote`包...
5. 容器初探:Tomcat中的容器主要是指Servlet容器,它负责管理Servlet的生命周期,包括加载、初始化、调用以及销毁。容器设计基于责任链模式,每个容器都按照特定的顺序处理请求。深入研究容器的实现可以帮助我们...