4 如何实现Connector
由上面的介绍我们可以知道,实现Connector就是实现ProtocolHander接口的过程。
AjpAprProtocol、AjpProtocol、Http11AprProtocol、Http11Protocol、JkCoyoteHandler、MemoryProtocolHandler这些实现类的实现流程与Http11NioProtocol相同,下面我们以Http11NioProtocol为类重点说明tomcat中如何实现ProtocolHander接口的。
Http11NioProtocol实现了ProtocolHander接口,它将所有的操作委托给NioEndpoint类去做,如下图:
NioEndpoint类中的init方法中首先以普通阻塞方式启动了SocketServer:
NioEndpoint类的start方法是关键,如下:
可以看出,在start方法中启动了两个线程和一个线程池:
- Acceptor线程,该线程以普通阻塞方式接收客户端请求(socket.accep()),将客户Socket交由线程池是处理,线程池要将该Socket配置成非阻塞模式(socket.configureBlocking(false)),并且向Selector注册READ事件。该线程数目可配置,默认为1个。
- Poller线程,由于Acceptor委托线程为客户端Socket注册了READ事件,当READ准备好时,就会进入Poller线程的循环,Poller线程也是委托线程池去做,线程池将NioChannel加入到ConcurrentLinkedQueue<NioChannel>队列中。该线程数目可配置,默认为1个。
- 线程池,就是上面说的做Acceptor与Poller线程委托要做的事情。
4.1 Init接口实现方法中阻塞方式启动ServerSocketChannel
在Init接口实现方法中阻塞方式启动ServerSocketChannel。
4.2 Start接口实现方法中启动所有线程
Start方法中启动了线程池,acceptor线程与Poller线程。其中acceptor与poller线程一般数目为1,当然,数目也可配置。
可以看出,线程池有两种实现方式:
- 普通queue + wait + notify方式,默认使用的方式,据说实际测试这种比下种效率高
- JDK1.5自带的线程池方式
4.3 Acceptor线程接收客户请求、注册READ事件
在Acceptor线程中接收了客户请求,同时委托线程池注册READ事件。
- 在Acceptior线程中接收了客户请求(serverSock.accept())
- 委托线程池处理
- 在线程池的Worker线程的run方法中有这么几句:
在setSocketOptions方法中,首先将socket配置成非阻塞模式:
在setSocketOptions方法中,最后调用getPoller0().register(channel);一句为SocketChannel注册READ事件,register方法代码如下(注意:这是Poller线程的方法):
其中attachment的结构如下,它可以看做是一个共享的数据结构:
4.4 Poller线程读请求、生成响应数据、注册WRITE事件
- 在上面说的setSocketOptions方法中调用Poller线程的register方法注册读事件之后,当READ准备就绪之后,就开始读了。下面代码位于Poller线程的run方法之中:
- 可以看到,可读之后调用processSocket方法,该方法将读处理操作委拖给线程池处理(注意此时加入到线程池的是NioChannel,不是SocketChannel):
- 线程池的Worker线程中的run方法中的部分代码如下(请注意handler.process(socket)这一句):
- 调用了hanler.process(socket)来生成响应数据)
- 数据生成完之后,注册WRITE事件的,代码如下:
注意:
4.5 Handle接口实现类通过Adpater调用Servlet容器生成响应数据
NioEndpoint类中的Handler接口定义如下:
其中process方法通过Adapter来调用Servlet Container生成返回结果。Adapter接口定义如下:
4.6 小结
实现一个tomcat连接器Connector就是实现ProtocolHander接口的过程。Connector用来接收Socket Client端的请求,通过内置的线程池去调用Servlet Container生成响应结果,并将响应结果同步或异步的返回给Socket Client。在第三方应用集成tomcat作为Web容器时,一般不会动Servlet Container端的代码,那么connector的性能将是整个Web容器性能的关键。
关于作者
张华,长期从事Java方面的开发工作,有搜索引擎、中间件应用服务器、互联网、云计算等领域的行业经验,目前正在从事基于Power的虚拟化技术研发。博客地址:http://blog.csdn.net/quqi99
分享到:
相关推荐
项目-tomcat
Tomcat1,Tomcat2,Tomcat3,Tomcat4,Tomcat5,Tomcat6 是可以配置成 三组互相复制Session的群组, 比如Tomcat1和Tomcat2互相同步Session, 比如Tomcat3和Tomcat4互相同步Session, 比如Tomcat5和Tomcat6互相同步Session....
安装tomcat 1.下载tomcat 2.上传到linux 3.新建一个文件夹 mkdir /usr/local/tomcat 4.移动或者复制 tomcat...tar.gz 到 /usr/local/tomcat mv apache-tomcat-7.0.52.tar.gz /usr/local/tomcat/ 5.进入/usr/...
tomcat+apache实现集群/负载均衡,... 修改tomcat1, tomcat2的server.xml,将集群部分配置的在注释符删掉,并将tomcat2的4001端口改为4002,以避免与tomcat冲突,当然,如果是两台电脑,是不用改端口的,去掉注释符即可。
worker.controller.balanced_workers=tomcat1,tomcat2,tomcat3 worker.controller.sticky_session=false worker.controller.sticky_session_force=1 #worker.controller.sticky_session=1 如需手动配置内容如下...
apache2.2 + tomcat6 整合以及集群配置
2、修改环境变量 在目录/etc下修改profile文件 export CATALINA_HOME=/usr/local/tomcat export CLASSPATH=.:$JAVA_HOME/lib:$CATALINA_HOME/lib export PATH=$PATH:$CATALINA_HOME/bin 执行命令: source /etc/...
tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat...
内含tomcat7 tomcat8 tomcat9免安装版本;供需要的人下载。
{启动Tomcat2} 表示我的tomcat2是好使的! 1、群集搭建: 首先我们要有两台机器每台机器上各装有tomcat和java运行环境: 举例场景: 注意这里的tomcat1和tomcat2是分部在两台机器上的,他们的IP分别为: tomcat1: ...
包含tomcat7,tomcat8,tomcat9,解压、在eclipse配置好即可。
{启动Tomcat2} 表示我的tomcat2是好使的! 1、群集搭建: 首先我们要有两台机器每台机器上各装有tomcat和java运行环境: 举例场景: 注意这里的tomcat1和tomcat2是分部在两台机器上的,他们的IP分别为: tomcat1: ...
Tomcat Tomcat Tomcat Tomcat
tomcat 5.0tomcat 5.0tomcat 5.0tomcat 5.0tomcat 5.0tomcat 5.0tomcat 5.0tomcat 5.0tomcat 5.0tomcat 5.0tomcat 5.0tomcat 5.0tomcat 5.0tomcat 5.0tomcat 5.0tomcat 5.0
tomcat8.0版本下载tomcat8.0版本下载tomcat8.0版本下载tomcat8.0版本下载tomcat8.0版本下载tomcat8.0版本下载tomcat8.0版本下载tomcat8.0版本下载tomcat8.0版本下载tomcat8.0版本下载tomcat8.0版本下载tomcat8.0版本...
tomcat 系列tomcat 系列tomcat 系列
Eclipse Tomcat插件 1. 在Eclipse 启动Tomcat 2. 方便调试
tomcat6、tomcat7、tocmat8、tomcat9 linux版、windox版 32位 64位
Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaServer Page(JSP)的支持,并提供了作为 Web服务器的一些特有功能,如Tomcat管理...
tomcat8资源下载链接tomcat8tomcat8资源下载链接tomcat8tomcat8资源下载链接tomcat8tomcat8资源下载链接tomcat8