Server组件初始化之后,接着就该初始化Service组件。
public void initialize() throws LifecycleException { initialized = true; 。 。 。 略 // Initialize our defined Connectors synchronized (connectors) { for (int i = 0; i < connectors.length; i++) { try { connectors[i].initialize(); } catch (Exception e) { String message = sm.getString( "standardService.connector.initFailed", connectors[i]); log.error(message, e); if (Boolean.getBoolean("org.apache.catalina.startup.EXIT_ON_INIT_FAILURE")) throw new LifecycleException(message); } } } }Service组件初始化的过程比较简单,首先将initialized 的值置为true,然后注册JMX服务,除此之外没有其他的操作。 一个Service组件可以包含多个连接器组件,那么接着看连接器组件的初始化。 Connector类的initialize方法主要做了三件事,首先将initialized的值置为true,接着将Connector对象传给CoyoteAdapter,并实例化CoyoteAdapter类,CoyoteAdapter类的作用会在讲解处理请求的过程中详细介绍。最后调用ProtocolHandler实现类的init方法。 ProtocolHandler接口的作用是管理网络连接的状态,接口中定义了init,start,destroy等方法,分别用于初始化连接器,启动接收请求线程并使其处于监听状态和关闭Socket连接等操作。Tomcat默认使用的协议是HTTP/1.1,因此,这里用到的类是Http11Protocol,那么接着看Http11Protocol类的init方法。 Http11Protocol的init方法中,设置完连接的名称和连接处理器之后,调用JIoEndpoint的init继续进行初始化。 可以看出前面Connector和Http11Protocol类的init方法逻辑都比较简单,其作用是在为后面真正的初始化操作做铺垫,而正真执行连接器初始化的操作是在JIoEndpoint的init方法中。
public void init() throws Exception { if (initialized) return; // Initialize thread count defaults for acceptor if (acceptorThreadCount == 0) { acceptorThreadCount = 1; } if (serverSocketFactory == null) { serverSocketFactory = ServerSocketFactory.getDefault(); } if (serverSocket == null) { try { if (address == null) { serverSocket = serverSocketFactory.createSocket(port, backlog); } else { serverSocket = serverSocketFactory.createSocket(port, backlog, address); } } catch (BindException orig) { String msg; if (address == null) msg = orig.getMessage() + " <null>:" + port; else msg = orig.getMessage() + " " + address.toString() + ":" + port; BindException be = new BindException(msg); be.initCause(orig); throw be; } } //if( serverTimeout >= 0 ) // serverSocket.setSoTimeout( serverTimeout ); initialized = true;在init方法中,首先初始化acceptorThreadCount 的值,如果值为0的话则置为1。 acceptorThreadCount 的值代表需要启动的接收线程的数量,在启动接收线程的时候会用到。接着实例化Socket工厂对象,默认使用的是DefaultServerSocketFactory类。有了工厂对象之后就可以通过工厂对象来创建Socket对象了,到这一步Tomcat的初始化过程算是执行完了,关于Sokcet对象启动监听,接收请求,那是后面的start过程了。未完待续。。。。。。