Tomcat源码阅读之初始化连接器组件

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值