Tomcat处理请求的类Connector<二>

这次主要解析采用IO方式处理请求.在Server.xml的配置如下:

Xml代码 

<Connector port="8080" protocol="HTTP/1.1"   
            connectionTimeout="20000"   
            redirectPort="8443" />

在tomcat启动的时候,会调用Connector类的Start()方法,根据以上配置,Connector的start()方法里会调用Http11Protocol类的start()方法,如下:

Java代码

try {  
     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));  
 }

Http11Protocol类的start()方法又会调用JIoEndpoint类的start()方法,如下: 

try {  
   endpoint.start();  
} catch (Exception ex) {  
   log.error(sm.getString("http11protocol.endpoint.starterror"), ex);  
   throw ex;  
}

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  
	    if (executor == null) {  
		workers = new WorkerStack(maxThreads);  
	    }  

	    // Start acceptor threads  
	    for (int i = 0; i < acceptorThreadCount; i++) {  
		Thread acceptorThread = new Thread(new Acceptor(), getName() + "-Acceptor-" + i);  
		acceptorThread.setPriority(threadPriority);  
		acceptorThread.setDaemon(daemon);  
		acceptorThread.start();  
	    }  
	}  
}

该方法主要初始化了接受Socket的线程Acceptor类,处理Socket的线程池WorkerStack.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 {  
                   Socket socket = serverSocketFactory.acceptSocket(serverSocket);  
                   serverSocketFactory.initSocket(socket);  
                   // Hand this socket off to an appropriate processor  
                   if (!processSocket(socket)) {//将socket交给线程池WorkerStack处理  
                       // 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  
  
           }  
  
       }  
  
   }

processSocket(socket)方法如下: 

protected boolean processSocket(Socket socket) {  
    try {  
        if (executor == null) {  
            getWorkerThread().assign(socket);//将socket分给独立的线程worker处理  
        } else {  
            executor.execute(new SocketProcessor(socket));  
        }  
    } catch (Throwable t) {  
        // This means we got an OOM or similar creating a thread, or that  
        // the pool and its queue are full  
        log.error(sm.getString("endpoint.process.fail"), t);  
        return false;  
    }  
    return true;  
}

worker的run()方法如下: 

public void run() {  
  
    // Process requests until we receive a shutdown signal  
    while (running) {  

	// Wait for the next socket to be assigned  
	Socket socket = await();  
	if (socket == null)  
	    continue;  

	// 将socket交给Http11ConnectionHandler处理  
	if (!setSocketOptions(socket) || !handler.process(socket)) {  
	    // Close socket  
	    try {  
		socket.close();  
	    } catch (IOException e) {  
	    }  
	}  

	// Finish up this request  
	socket = null;  
	recycleWorkerThread(this);  

    }  

}

handler.process(socket)方法如下: 

if (processor == null) {  
   processor = createProcessor();  
}  

if (processor instanceof ActionHook) {  
   ((ActionHook) processor).action(ActionCode.ACTION_START, null);  
}  

if (proto.isSSLEnabled() && (proto.sslImplementation != null)) {  
   processor.setSSLSupport(proto.sslImplementation.getSSLSupport(socket));  
} else {  
   processor.setSSLSupport(null);  
}  
//socket交由Http11Processor的process()方法处理  
processor.process(socket);  
return false;  

processor.process(socket)负责解析http协议并返回结果内容 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值