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过程了。未完待续。。。。。。