首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Tomcat源码-器皿启动六(4)

2012-10-11 
Tomcat源码---容器启动六(4)现在容器已经启动成功的StanderService#start中继续是executor(不作详解)与con

Tomcat源码---容器启动六(4)

现在容器已经启动成功的StanderService#start中继续是executor(不作详解)与connector的启动

?

  1. //两个connector的启动8080?8009??
  2. ???????synchronized?(connectors)?{??
  3. ???????????for?(int?i?=?0;?i?<?connectors.length;?i++)?{??
  4. ???????????????if?(connectors[i]?instanceof?Lifecycle)??
  5. ???????????????????((Lifecycle)?connectors[i]).start();??
  6. ???????????}??
  7. ???????} ?

?

?

Connector#start ?

/**     * Begin processing requests via this Connector.     *     * @exception LifecycleException if a fatal startup error occurs     */    public void start() throws LifecycleException {        if( !initialized )            initialize();        // Validate and update our current state        if (started ) {            if(log.isInfoEnabled())                log.info(sm.getString("coyoteConnector.alreadyStarted"));            return;        }        lifecycle.fireLifecycleEvent(START_EVENT, null);        started = true;        // We can't register earlier - the JMX registration of this happens        // in Server.start callback        if ( this.oname != null ) {            // We are registred - register the adapter as well.            try {                Registry.getRegistry(null, null).registerComponent                    (protocolHandler, createObjectName(this.domain,"ProtocolHandler"), null);            } catch (Exception ex) {                log.error(sm.getString                          ("coyoteConnector.protocolRegistrationFailed"), ex);            }        } else {            if(log.isInfoEnabled())                log.info(sm.getString                     ("coyoteConnector.cannotRegisterProtocol"));        }        try {            //Http11Protocol的启动            protocolHandler.start();        } catch (Exception e) {            String errPrefix = "";            if(this.service != null) {                errPrefix += "service.getName(): "" + this.service.getName() + ""; ";            }            throw new LifecycleException                (errPrefix + " " + sm.getString                 ("coyoteConnector.protocolHandlerStartFailed", e));        }        if( this.domain != null ) {            mapperListener.setDomain( domain );            //mapperListener.setEngine( service.getContainer().getName() );            mapperListener.init();            try {                ObjectName mapperOname = createObjectName(this.domain,"Mapper");                if (log.isDebugEnabled())                    log.debug(sm.getString(                            "coyoteConnector.MapperRegistration", mapperOname));                Registry.getRegistry(null, null).registerComponent                    (mapper, mapperOname, "Mapper");            } catch (Exception ex) {                log.error(sm.getString                        ("coyoteConnector.protocolRegistrationFailed"), ex);            }        }    }

?Http11Protocol#start

Http11Protocol#start public void start() throws Exception {        if (this.domain != null) {            try {                tpOname = new ObjectName                    (domain + ":" + "type=ThreadPool,name=" + getName());                Registry.getRegistry(null, null)                    .registerComponent(endpoint, tpOname, null );            } catch (Exception e) {                log.error("Can't register endpoint");            }            rgOname=new ObjectName                (domain + ":type=GlobalRequestProcessor,name=" + getName());            Registry.getRegistry(null, null).registerComponent                ( cHandler.global, rgOname, null );        }        try {            //如名所言,到了终点的启动            endpoint.start();        } catch (Exception ex) {            log.error(sm.getString("http11protocol.endpoint.starterror"), ex);            throw ex;        }        if (log.isInfoEnabled())            log.info(sm.getString("http11protocol.start", getName()));    }

?JIoEndPoint#start

public void start()        throws Exception {        // Initialize socket if not done before        if (!initialized) {            init();        }        if (!running) {            running = true;            paused = false;            // Create worker collection            //如果server.xml所配置executor为空,则采用默认的            if (executor == null) {                workers = new WorkerStack(maxThreads);            }            // Start acceptor threads            for (int i = 0; i < acceptorThreadCount; i++) {//这里的acceptor是一个线程,里面是一个serversocket的启动                Thread acceptorThread = new Thread(new Acceptor(), getName() + "-Acceptor-" + i);                acceptorThread.setPriority(threadPriority);                acceptorThread.setDaemon(daemon);                acceptorThread.start();            }        }    }

Acceptor#run

 public void run() {            // Loop until we receive a shutdown command            while (running) {                // Loop if endpoint is paused                while (paused) {                    try {                        Thread.sleep(1000);                    } catch (InterruptedException e) {                        // Ignore                    }                }                // Accept the next incoming connection from the server socket                try {   //这里进行了accept(),等待客户端消息,进行接收                    Socket socket = serverSocketFactory.acceptSocket(serverSocket);                    serverSocketFactory.initSocket(socket);                    // Hand this socket off to an appropriate processor                    if (!processSocket(socket)) {                        // Close socket right away                        try {                            socket.close();                        } catch (IOException e) {                            // Ignore                        }                    }                }catch ( IOException x ) {                    if ( running ) log.error(sm.getString("endpoint.accept.fail"), x);                } catch (Throwable t) {                    log.error(sm.getString("endpoint.accept.fail"), t);                }                // The processor will recycle itself when it finishes            }        }    }
?-----到这里启动已经全部完成,等待浏览器客的消息发送,以下详解消息的请求/响应.......

热点排行