首先摘自我的好友。傻博语录:人生就是悲剧
上次说到每一个请求会分配给一个Worker处理,而Worker与我们平时写代码都是围绕Servlet写的,到底又有些什么差别呢?
worker后面是委托给Handler处理的。
handler处理的时候分配给Http11Processor(Http11Processor被维护在一个先进先出队列当中)。
而所有的HttpProcessor共享Http11Protocal 的Adapter成员变量,Adapter会调用到Servlet,即所有Handler都用同一个Adapter。
首先请看图:
讲述下每个部分的作用:
JioEndPointer:启动一个线程监听socket,并把到来的请求分配给相应的worker
Http11ConnectionHandler: Http协议的基于普通IO的处理方式.
Adapter:Http协议的请求 委托或 适配给 servlet容器处理的适配器
attributes:Http协议的相关属性设置
其中的对应关系也非常重要:
A,1个worker 必须对应一个 Http11ConnectionHandler 中的Http11ConnectionProcessor(是handler里面真正处理的Http协议的类)
B,所有的worker都持有同一个Adapter
详细类图下图所示:
我在HttpServlet的service方法里设置了一个断点,然后调试了下,可以看一下调用栈。
调用栈很清晰得说明了调用到哪些类和顺序:也可以看官方化得时序图:
http://tomcat.apache.org/tomcat-6.0-doc/architecture/requestProcess/requestProcess.pdf
JIoEndpoint.java
/** * Create (or allocate) and return an available processor for use in * processing a specific HTTP request, if possible. If the maximum * allowed processors have already been created and are in use, return * <code>null</code> instead. */ protected Worker createWorkerThread() { synchronized (workers) { if (workers.size() > 0) { curThreadsBusy++; return workers.pop(); } if ((maxThreads > 0) && (curThreads < maxThreads)) { // 默认maxThreads 为200 curThreadsBusy++; if (curThreadsBusy == maxThreads) { log.info(sm.getString("endpoint.info.maxThreads", Integer.toString(maxThreads), address, Integer.toString(port))); } return (newWorkerThread()); } else { if (maxThreads < 0) { curThreadsBusy++; return (newWorkerThread()); } else { return (null); } } } } /** * Create and return a new processor suitable for processing HTTP * requests and returning the corresponding responses. */ protected Worker newWorkerThread() { Worker workerThread = new Worker(); workerThread.start(); return (workerThread); }
从代码来看,如果没有到达请求最大值,首先会从栈中取得空闲的Worker,或者创建新的Worker。
所以来一个请求,会分配给一个Worker,而Worker做了一些接收Socket,设置一些socket和需要的环境类,然后就交给了Servlet实例,而servlet实例启动的时候就是对于一个context 中配置的一个servlet只启动一个实例。
StandardWrapper.java
/** * Load and initialize an instance of this servlet, if there is not already * at least one initialized instance. This can be used, for example, to * load servlets that are marked in the deployment descriptor to be loaded * at server startup time. */ public synchronized Servlet loadServlet() throws ServletException { // Nothing to do if we already have an instance or an instance pool // 初始化servlet的时候,如果发现已经初始化完毕,则不再初始化 if (!singleThreadModel && (instance != null)) return instance;
所以首先servlet不是线程安全的。
其次 HttpSession不是线程安全的。
还有 Context不是现成安全的。
Request是线程安全的。
- 大小: 101.1 KB
- 大小: 136.9 KB
- 大小: 21.9 KB
- 大小: 100.1 KB
分享到:
相关推荐
首先需要了解Tomcat的配置文件——server.xml。它是Tomcat的核心配置文件,包含了多个子元素用于配置Tomcat的各个组件。server.xml文件中的主要元素包括、、和。其中,元素代表整个Catalina容器,是整个配置文件的根...
通过阅读源码,可以理解Tomcat的工作原理,如请求处理流程、线程模型等。同时,利用各种工具,如JVisualVM、JProfiler等,可以监控Tomcat的内存、CPU使用情况,进行性能调优。 总的来说,理解并熟练配置`server.xml...
在处理数据库连接方面,Tomcat提供了自己的数据源实现——tomcat-jdbc.jar,这是一个高效且线程安全的连接池实现。同时,tomcat-juli.jar是Tomcat的日志实用程序库,用于更灵活的日志管理。这两个JAR文件在开发和...
标题"Tomcat管理工具lambdaprobe工具及使用配置"表明我们将讨论的是一个用于管理Apache Tomcat服务器的工具——lambdaprobe。Tomcat是一款流行的开源Java Servlet容器,它用于部署和运行Java Web应用程序。...
描述中的“Tomcat 下如果需要多地址 配置目录下面加载新的路径”提到了关键配置元素——`<Host>`标签,这是在Tomcat的主配置文件`server.xml`中定义的。 首先,打开Tomcat的安装目录,找到`conf`子目录下的`server....
现在,回到主题——"Tomcat中配置数据源所需得jar包"。在`lib`目录下,你可能需要以下jar包: 1. 数据库驱动jar包:例如,如果你使用的是MySQL,你需要将`mysql-connector-java.jar`放入Tomcat的`lib`目录。这样,...
总结来说,Tomcat配置数据源连接池是一个关键步骤,它可以显著提升应用程序处理数据库请求的能力。通过合理配置连接池参数,可以有效防止资源浪费,确保系统稳定运行。HikariCP因其高性能和易用性,成为许多开发者的...
**JSP入门必看实例——销售管理系统** 销售管理系统是一个典型的Web应用程序,用于管理和跟踪销售相关的数据,如产品信息、订单、客户详情等。本实例基于MVC(Model-View-Controller)开发模式,该模式是Web应用...
在使用Tomcat的过程中,有时我们需要处理大文件上传或者大数据量的POST请求,这时就涉及到一个关键的配置参数——`maxPostSize`。本文将详细解析`maxPostSize`的含义、设置方法以及在不同版本Tomcat中的注意事项。 ...
根据提供的文件信息,本书《数据库开发这点事——人生需要引导》是一本专注于介绍数据库应用与J2EE开发的入门级教程。以下将对该书的主要知识点进行详细的解析。 ### 一、J2EE基础概述 #### 1.1 J2EE简介 J2EE...
【JavaWeb课程设计——图书馆管理系统】是一个典型的JavaWeb应用程序,旨在通过实践巩固并应用所学的JavaWeb技术,同时引入设计模式(GoF)的概念,提高系统的可维护性和可扩展性。在这个系统中,学生需要实现一个...
- 对于Java Web应用程序来说,可以在Tomcat服务器配置文件server.xml中设置connection pool的connectionProperties属性来指定连接数据库时的字符集编码,例如:`connectionProperties=useUnicode=true;...
### JavaWeb课程设计——图书馆管理系统知识点总结 #### 一、实验目的 本次实验的主要目标是在实践过程中深化对JavaWeb技术的理解,并初次应用设计模式(GoF),以体会其带来的优势。此外,还将结合数据库技术,...
10. **JDBC API**:使用JDBC进行数据库操作,包括Connection、Statement、ResultSet接口,DriverManager类,PreparedStatement和CallableStatement接口,以及批处理和存储过程调用。 **Java面向对象企业级应用核心...
《Servlet工作流程详解与数据库连接实践——以MyStore项目为例》 Servlet是Java Web开发中的核心组件,主要用于处理客户端请求并生成动态响应。在MyStore项目中,我们深入探讨了Servlet的工作流程,以及如何实现...
【JAVA初级教程——Web系统开发技术与方法】涵盖了Web编程的多个核心领域,旨在帮助初学者建立起完整的Web系统开发知识体系。以下是对每个知识点的详细解释: 1. **Web编程基本知识**: - **HTML**是超文本标记...
使用java.sql.DriverManager类加载驱动,然后调用Connection接口的connect()方法建立连接。编写SQL语句进行增删改查操作。 5. **Servlet处理**:创建Servlet类,如"LoginServlet"和"RegisterServlet",分别处理登录...
### 平台优化与部署——基于Tomcat的项目平台优化技术要点 #### 一、引言 随着互联网技术的发展,企业对于网站平台的稳定性和性能要求越来越高。在众多的Java Web容器中,Tomcat因其简单易用且轻量级的特点而被广泛...