Tomcat源码解读系列(三)——Tomcat对HTTP请求处理的整体流程
?
protected boolean processSocket(Socket socket) { try { if (executor == null) { getWorkerThread().assign(socket); } else { executor.execute(new SocketProcessor(socket)); } } catch (Throwable t) { //……此处略去若干代码 } return true; }
protected Worker getWorkerThread() { // Allocate a new worker thread synchronized (workers) { Worker workerThread; while ((workerThread = createWorkerThread()) == null) { try { workers.wait(); } catch (InterruptedException e) { // Ignore } } return workerThread; } }
protected Worker createWorkerThread() { synchronized (workers) { if (workers.size() > 0) { //如果线程池中有空闲的线程,取一个 curThreadsBusy++; return workers.pop(); } if ((maxThreads > 0) && (curThreads < maxThreads)) { //如果还没有超过最大线程数,会新建一个线程 curThreadsBusy++; return (newWorkerThread()); } else { if (maxThreads < 0) { curThreadsBusy++; return (newWorkerThread()); } else { return (null); } } } }
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; if (!setSocketOptions(socket) || !handler.process(socket)) { try { socket.close(); } catch (IOException e) { } } socket = null; recycleWorkerThread(this); } }
?在这个过程中,会对原始的socket进行一些处理,到CoyoteAdapter时,接受的参数已经是org.apache.coyote.Request和org.apache.coyote.Response了,但是要注意的是,此时这两个类并不是我们常用的HttpServletRequest和HttpServletResponse的实现类,而是Tomcat内部的数据结构,存储了和输入、输出相关的信息。值得注意的是,在CoyoteAdapter的service方法中,会调用名为postParseRequest的方法,在这个方法中,会解析请求,调用Mapper的Map方法来确定该请求该由哪个Engine、Host和Context来处理。
connector.getContainer().getPipeline().getFirst().invoke(request, response);
?可以将请求想象成水的流动,请求需要在各个组件之间流动,中间经过若干的水管和水阀,等所有的水阀走完,请求也就处理完了,而每个组件都会有一个默认的水阀(以Standard作为类的前缀)来进行请求的处理,如果业务需要的话,可以自定义Valve,将其安装到容器中。
?在以上的流程中,会一层层地调用各个容器组件的Valve的invoke方法,其中StandardWrapperValve这个标准阀门将会调用StandardWrapper的allocate方法来获取真正要执行的Servlet(在Tomcat中所有的请求最终都会映射到一个Servlet,静态资源和JSP也是如此),并按照请求的地址来构建过滤器链,按照顺序执行各个过滤器并最终调用目标Servlet的service方法,来完成业务的真正处理。
至此,我们简单了解一个请求的处理流程。
1 楼 liuningbo 2012-09-10 不错!顶起 2 楼 w156445045 2012-09-10 请问下博主是用的啥工具画图的啊?图不错,很赞。 3 楼 1927105 2012-09-12 w156445045 写道请问下博主是用的啥工具画图的啊?图不错,很赞。