tomcat服务器解析(七)-- Processor&Endpoint&ProtocolHandler
2015-06-17 20:26
543 查看
请求到达Poller处理,最终是由Processor来进行处理,为了说明这中间过程所涉及的部分,先整理下在tomcat服务的各个组成部分:ProtocolHandler、Endpoint、Endpoint.Handler、Processor
它们之间的引用关系如下
[ProtocolHandler] <--------- Connector
org.apache.coyote.ProtocolHandler
org.apache.coyote.AbstractProtocol
org.apache.coyote.http11.AbstractHttp11Protocol
org.apache.coyote.http11.AbstractHttp11JsseProtocol
org.apache.coyote.http11.Http11NioProtocol *
[Endpoint] <--------- ProtocolHandler(Http11NioProtocol)
org.apache.tomcat.util.net.AbstractEndpoint
org.apache.tomcat.util.net.NioEndpoint *
处理连接数的控制、连接的建立等工作,主要包括Acceptor和Poller两大部分,将建立好的连接交由Endpoint的Handler去处理
[Endpoint.Handler] <--------- Endpoint(NioEndpoint)
AbstractEndpoint.Handler
AbstractConnectionHandler < -- > AbstractProtocol
Http11ConnectionHandler < -- > Http11NioProtocol *
缓存连接和Processor的关系,根据连接寻找Processor来处理
[Processor] <--------- Endpoint.Handler
org.apache.coyote.Processor
org.apache.coyote.AbstractProcessor
org.apache.coyote.http11.AbstractHttp11Processor
org.apache.coyote.http11.Http11NioProcessor *
(process方法)处理http请求中的相关业务,服务状态,协议解析,请求握手,内容解压等,构造适合Adapter处理request和response对象,然后调用Adater进行业务数据处理。
Acceptor和Poller都是属于Endpoint的内部组成部分,所以,这里是socket连接有数据到达时,被交到Endpoint.Handler中,经过缓存加速,找到对应的Processor之后,交由Processor来处理。
Processor处理完http协议相关的内容后,交由Adapter来处理业务。
Q&A
1、在什么时候读取请求数据?
Java Servlet开发模型中,由开发者自定义的servlet来通过InputStream读取数据,通过OutputStream写入数据。所以,以上的这些部分,都不涉及到具体业务数据的读写。具体的数据读写时机,在Adapter之后。
2、请求如何被转到用户自定义的Servlet上的?
具体的实现,在Adapter之后的部分,这里并不涉及与此相关的部分。
3、服务的连接数是如何控制的?
Endpoint内部的Acceptor来控制,Endpoint提供了setMaxConnection方法来设置tomcat所能支持的最大连接数。此方法会设置一个Acceptor用的一个LimitLatch锁。通过LimitLatch来控制连接的数量。当有新连接加入时,会增加计算器;连接关闭时,会将计数器减一。
4、tomcat服务内在哪个地方使用了线程池?
Endpoint内部的Poller用来选出有数据到达的socket连接,并将连接交给Endpoint.Handler来进行处理。这个传递事件被封装成了一个SocketProcessor任务,通过执行SocketProcessor任务来完成。
SocketProcessor的执行时再线程池中实现的,也就是Endpoint的Poller线程,将事件转成SocketProcessor任务后,放在Endpoint的ThreadPool中完成。
5、启动tomcat服务时,可以通过配置文件传递很多参数,包括port、protocol、maxConnections、maxThreads是如何生效的?
Sorry, I don't know. I haven't reached that point !
6、What's the point of this series passages ?
For now, It doesn't make any sense. And I don't know why I had started reading, or will I continue ... ...
它们之间的引用关系如下
[ProtocolHandler] <--------- Connector
org.apache.coyote.ProtocolHandler
org.apache.coyote.AbstractProtocol
org.apache.coyote.http11.AbstractHttp11Protocol
org.apache.coyote.http11.AbstractHttp11JsseProtocol
org.apache.coyote.http11.Http11NioProtocol *
[Endpoint] <--------- ProtocolHandler(Http11NioProtocol)
org.apache.tomcat.util.net.AbstractEndpoint
org.apache.tomcat.util.net.NioEndpoint *
处理连接数的控制、连接的建立等工作,主要包括Acceptor和Poller两大部分,将建立好的连接交由Endpoint的Handler去处理
[Endpoint.Handler] <--------- Endpoint(NioEndpoint)
AbstractEndpoint.Handler
AbstractConnectionHandler < -- > AbstractProtocol
Http11ConnectionHandler < -- > Http11NioProtocol *
缓存连接和Processor的关系,根据连接寻找Processor来处理
[Processor] <--------- Endpoint.Handler
org.apache.coyote.Processor
org.apache.coyote.AbstractProcessor
org.apache.coyote.http11.AbstractHttp11Processor
org.apache.coyote.http11.Http11NioProcessor *
(process方法)处理http请求中的相关业务,服务状态,协议解析,请求握手,内容解压等,构造适合Adapter处理request和response对象,然后调用Adater进行业务数据处理。
Acceptor和Poller都是属于Endpoint的内部组成部分,所以,这里是socket连接有数据到达时,被交到Endpoint.Handler中,经过缓存加速,找到对应的Processor之后,交由Processor来处理。
Processor处理完http协议相关的内容后,交由Adapter来处理业务。
Q&A
1、在什么时候读取请求数据?
Java Servlet开发模型中,由开发者自定义的servlet来通过InputStream读取数据,通过OutputStream写入数据。所以,以上的这些部分,都不涉及到具体业务数据的读写。具体的数据读写时机,在Adapter之后。
2、请求如何被转到用户自定义的Servlet上的?
具体的实现,在Adapter之后的部分,这里并不涉及与此相关的部分。
3、服务的连接数是如何控制的?
Endpoint内部的Acceptor来控制,Endpoint提供了setMaxConnection方法来设置tomcat所能支持的最大连接数。此方法会设置一个Acceptor用的一个LimitLatch锁。通过LimitLatch来控制连接的数量。当有新连接加入时,会增加计算器;连接关闭时,会将计数器减一。
4、tomcat服务内在哪个地方使用了线程池?
Endpoint内部的Poller用来选出有数据到达的socket连接,并将连接交给Endpoint.Handler来进行处理。这个传递事件被封装成了一个SocketProcessor任务,通过执行SocketProcessor任务来完成。
SocketProcessor的执行时再线程池中实现的,也就是Endpoint的Poller线程,将事件转成SocketProcessor任务后,放在Endpoint的ThreadPool中完成。
5、启动tomcat服务时,可以通过配置文件传递很多参数,包括port、protocol、maxConnections、maxThreads是如何生效的?
Sorry, I don't know. I haven't reached that point !
6、What's the point of this series passages ?
For now, It doesn't make any sense. And I don't know why I had started reading, or will I continue ... ...
相关文章推荐
- maven项目放入tomcat中找不到jar包
- Tomcat下log4j设置文件路径和temp目录
- web应用性能测试-Tomcat 7 连接数和线程数配置
- 修改tomcat默认的编码方式
- linux下tomcat无法访问问题
- JDK自带jvisualvm监控tomcat
- Tomcat常用的优化技巧
- tomcat7连接池使用
- tomcat安全配置
- linux下tomcat环境搭建
- tomcat 内存溢出
- java使用tomcat数据源连接mysql
- tomcat 设置 HTML5 的离线缓存
- 如何定时重启Tomcat并部署新的项目代码
- Tomcat CatalinaProperties的loadProperties()方法
- apache 通过 mod_jk 链接 tomcat
- CentOS6.4 安装tomcat
- linux 开机启动tomcat程序和jar程序
- 刚刚大学毕业,自己搭网站遇到的问题 一:tomcat中同时部署两个项目的问题
- 关于MyEclipse(jsp+Tomcat)与 SQLSERVER 2012 JDBC连接的问题解决方法