欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Tomcat启动源码流程分析(图解及源码注释) (四)

程序员文章站 2022-07-14 10:49:36
...

Tomcat初始化源码流程分析(图解及源码注释) (一)

Tomcat初始化源码流程分析(图解及源码注释) (二)

Tomcat启动源码流程分析(图解及源码注释) (三)

Tomcat启动源码流程分析(图解及源码注释) (四)

本章为Tomcat初始化流程的第三章,主要内容为Connector的启动分支.

Tomcat初始化源码不适用于新手

文章内容只有部分流程的源码分析,通过代码注释的方法,仅适用于Tomcat的源码有一定的了解的同学

前三大目录在第三章有详细代码说明,在第四章章节不再赘述.

目录

1. BootStrap.start() ---> Catalina.start()

2. Server.start() ---> StandardServer.startInternal()

3. Service.start() ---> StandardService.startInternal()

4. Connector.startInternal()

5.ProtocolHandler.start() ---> AbstractProtocol.start()

6.Endpoint.start() ---> NioEndpoint.startInternal()

6.1 startAcceptorThreads


Tomcat启动源码流程分析(图解及源码注释) (四)

4. Connector.startInternal()

 protected void startInternal() throws LifecycleException {

        // Validate settings before starting
        if (getPort() < 0) {
            throw new LifecycleException(sm.getString(
                    "coyoteConnector.invalidPort", Integer.valueOf(getPort())));
        }

        setState(LifecycleState.STARTING);

        try {
            //启动ProtocolHandler
            //调用AbstractProtocol.start()
            protocolHandler.start();
        } catch (Exception e) {
            throw new LifecycleException(
                    sm.getString("coyoteConnector.protocolHandlerStartFailed"), e);
        }
    }

5.ProtocolHandler.start() ---> AbstractProtocol.start()

public void start() throws Exception {
        if (getLog().isInfoEnabled()) {
            getLog().info(sm.getString("abstractProtocolHandler.start", getName()));
        }

        //启动Endpoint开始监听
        endpoint.start();

        // Start timeout thread
        asyncTimeout = new AsyncTimeout();
        Thread timeoutThread = new Thread(asyncTimeout, getNameInternal() + "-AsyncTimeout");
        int priority = endpoint.getThreadPriority();
        if (priority < Thread.MIN_PRIORITY || priority > Thread.MAX_PRIORITY) {
            priority = Thread.NORM_PRIORITY;
        }
        timeoutThread.setPriority(priority);
        timeoutThread.setDaemon(true);
        timeoutThread.start();
    }

6.Endpoint.start() ---> NioEndpoint.startInternal()

public void startInternal() throws Exception {

        if (!running) {
            running = true;
            paused = false;

            processorCache = new SynchronizedStack<>(SynchronizedStack.DEFAULT_SIZE,
                    socketProperties.getProcessorCache());
            eventCache = new SynchronizedStack<>(SynchronizedStack.DEFAULT_SIZE,
                            socketProperties.getEventCache());
            nioChannels = new SynchronizedStack<>(SynchronizedStack.DEFAULT_SIZE,
                    socketProperties.getBufferPool());

            // Create worker collection
            if ( getExecutor() == null ) {
                createExecutor();
            }

            initializeConnectionLatch();

            // 开启poller线程
            pollers = new Poller[getPollerThreadCount()];
            for (int i=0; i<pollers.length; i++) {
                pollers[i] = new Poller();
                Thread pollerThread = new Thread(pollers[i], getName() + "-ClientPoller-"+i);
                pollerThread.setPriority(threadPriority);
                pollerThread.setDaemon(true);
                pollerThread.start();
            }

            //开启acceptor线程
            startAcceptorThreads();
        }

6.1 startAcceptorThreads

protected final void startAcceptorThreads() {
        //根据初始化时设置的值开启accepter监听
        int count = getAcceptorThreadCount();
        acceptors = new Acceptor[count];

        for (int i = 0; i < count; i++) {
            //模板方法,创建一个accepter实例
            acceptors[i] = createAcceptor();
            String threadName = getName() + "-Acceptor-" + i;
            acceptors[i].setThreadName(threadName);
            Thread t = new Thread(acceptors[i], threadName);
            t.setPriority(getAcceptorThreadPriority());
            t.setDaemon(getDaemon());
            t.start();
        }
    }