现在容器已经启动成功的StanderService#start中继续是executor(不作详解)与connector的启动
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 } } }-----到这里启动已经全部完成,等待浏览器客的消息发送,以下详解消息的请求/响应.......