资源预览内容
第1页 / 共43页
第2页 / 共43页
第3页 / 共43页
第4页 / 共43页
第5页 / 共43页
第6页 / 共43页
第7页 / 共43页
第8页 / 共43页
第9页 / 共43页
第10页 / 共43页
亲,该文档总共43页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
Tomcat 总体结构 Tomcat 的结构很复杂,但是 Tomcat 也非常的模块化,找到了 Tomcat 最核心的模块,您就抓住了 Tomcat 的“七寸” 。下面是 Tomcat 的总体结构图:图 1.Tomcat 的总体结构 从上图中可以看出 Tomcat 的心脏是两个组件:Connector 和 Container,关于这两个组件将在后面详细介绍。Connector 组件是可以被替换,这样可以提供给服务器设计者更多的选择,因为这个组件是如此重要,不仅跟服务器的设计的本身,而且和不同的应用场景也十分相关,所以一个 Container 可以选择对应多个 Connector。多个 Connector 和一个 Container 就形成了一个 Service,Service 的概念大家都很熟悉了,有了 Service 就可以对外提供服务了,但是 Service 还要一个生存的环境,必须要有人能够给她生命、掌握其生死大权,那就非 Server 莫属了。所以整个 Tomcat 的生命周期由 Server 控制。以 Service 作为“婚姻” 我们将 Tomcat 中 Connector、Container 作为一个整体比作一对情侣的话,Connector 主要负责对外交流,可以比作为 Boy,Container 主要处理 Connector 接受的请求,主要是处理内部事务,可以比作为 Girl。那么这个 Service 就是连接这对男女的结婚证了。是 Service 将它们连接在一起,共同组成一个家庭。当然要组成一个家庭还要很多其它的元素。说白了,Service 只是在 Connector 和 Container 外面多包一层,把它们组装在一起,向外面提供服务,一个 Service 可以设置多个 Connector,但是只能有一个 Container 容器。这个 Service 接口的方法列表如下:图 2. Service 接口 从 Service 接口中定义的方法中可以看出,它主要是为了关联 Connector 和 Container,同时会初始化它下面的其它组件,注意接口中它并没有规定一定要控制它下面的组件的生命周期。所有组件的生命周期在一个 Lifecycle 的接口中控制,这里用到了一个重要的设计模式,关于这个接口将在后面介绍。Tomcat 中 Service 接口的标准实现类是 StandardService 它不仅实现了 Service 借口同时还实现了 Lifecycle 接口,这样它就可以控制它下面的组件的生命周期了。StandardService 类结构图如下:图 3. StandardService 的类结构图 从上图中可以看出除了 Service 接口的方法的实现以及控制组件生命周期的 Lifecycle 接口的实现,还有几个方法是用于在事件监听的方法的实现,不仅是这个 Service 组件,Tomcat 中其它组件也同样有这几个方法,这也是一个典型的设计模式,将在后面介绍。下面看一下 StandardService 中主要的几个方法实现的代码,下面是 setContainer 和 addConnector 方法的源码:清单 1. StandardService. SetContainer view plaincopy to clipboardprint?01.public void setContainer(Container container) 02. Container oldContainer = this.container; 03. if (oldContainer != null) 05. this.container = container; 06. if (this.container != null) & (this.container instanceof Engine) 07. (Engine) this.container).setService(this); 08. if (started & (this.container != null) & (this.container instanceof Lifecycle) 09. try 10. (Lifecycle) this.container).start(); 11. catch (LifecycleException e) 12. ; 13. 14. 15. synchronized (connectors) 16. for (int i = 0; i 0) & (curProcessors = maxProcessors) 11. break; 12. HttpProcessor processor = newProcessor(); 13. recycle(processor); 14. 15. public void start() throws LifecycleException if (started)throw new LifecycleException(sm.getString(httpConnector.alreadyStarted);threadName = HttpConnector + port + ;lifecycle.fireLifecycleEvent(START_EVENT, null);started = true;threadStart();while (curProcessors 0) & (curProcessors = maxProcessors)break;HttpProcessor processor = newProcessor();recycle(processor); threadStart() 执行就会进入等待请求的状态,直到一个新的请求到来才会激活它继续执行,这个激活是在 HttpProcessor 的 assign 方法中,这个方法是代码如下 : 清单 7. HttpProcessor.assign view plaincopy to clipboardprint?01.synchronized void assign(Socket socket) 02. while (available) 03. try 04. wait(); 05. catch (InterruptedException e) 06. 07. 08. this.socket = socket; 09. available = true; 10. notifyAll(); 11. if (debug = 1) & (socket != null) 12. log( An incoming request is being assigned); 13. synchronized void assign(Socket socket) while (available) try wait(); catch (InterruptedException e) this.socket = socket;available = true;notifyAll();if (debug = 1) & (socket != null)log( An incoming request is being assigned); 创建 HttpProcessor 对象是会把 available 设为 false,所以当请求到来时不会进入 while 循环,将请求的 socket 赋给当期处理的 socket,并将 available 设为 true,当 available 设为 true 是 HttpProcessor 的 run 方法将被激活,接下去将会处理这次请求。Run 方法代码如下:清单 8. HttpProcessor.Run view plaincopy to clipboardprint?01.public void run() 02. while (!stopped) 03. Socket socket = await(); 04. if (socket = null) 05. continue; 06. try 07. process(socket); 08. catch (Throwable t) 09. log(process.invoke, t); 10. 11. connector.recycle(this); 12. 13. synchronized (threadSync) 14. threadSync.notifyAll(); 15. 16. public void run() while (!stopped) Socket socket = await(); if (socket = null) continue; try process(socket); catch (Throwable t) log(process.invoke, t); connector.recycle(this); synchronized (threadSync) threadSync.notifyAll(); 解析 socket 的过程在 process 方法中,process 方法的代码片段如下:清单 9. HttpProcessor.process view plaincopy to clipboardprint?01.private void process(Socket socket) 02. boolean ok = true; 03. boolean finishResponse = true; 04. SocketInputStream input = null; 05. OutputStream output = null; 06. try 07. input = new SocketInputStream(socket.getInputStream(),connector.getBufferSize(); 08. catch (Exception e) 09. log(process.create, e); 10. ok = false; 11. 12. keepAlive = true; 13. while (!stopped & ok & keepAlive) 14. finishRes
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号