博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Tomcat 7服务器线程模型
阅读量:6760 次
发布时间:2019-06-26

本文共 1415 字,大约阅读时间需要 4 分钟。

 

Tomcat 7服务器网络处理主要由NioEndpoint,其处理客户端连接的主要流程如图所示

图中Acceptor及Worker分别是以线程池形式存在,Poller是一个单线程。注意,与BIO的实现一样,缺省状态下,在server.xml中没有配置<Executor>,则以Worker线程池运行,如果配置了<Executor>,则以基于java concurrent 系列的java.util.concurrent.ThreadPoolExecutor线程池运行。 
Acceptor 
接收socket线程,这里虽然是基于NIO的connector,但是在接收socket方面还是传统的serverSocket.accept()方式,获得SocketChannel对象,然后封装在一个tomcat的实现类org.apache.tomcat.util.net.NioChannel对象中。然后将NioChannel对象封装在一个PollerEvent对象中,并将PollerEvent对象压入events queue里。这里是个典型的生产者-消费者模式,Acceptor与Poller线程之间通过queue通信,Acceptor是events queue的生产者,Poller是events queue的消费者。 
Poller 
Poller线程中维护了一个Selector对象,NIO就是基于Selector来完成逻辑的。在connector中并不止一个Selector,在socket的读写数据时,为了控制timeout也有一个Selector,在后面的BlockSelector中介绍。可以先把Poller线程中维护的这个Selector标为主Selector。 
Poller是NIO实现的主要线程。首先作为events queue的消费者,从queue中取出PollerEvent对象,然后将此对象中的channel以OP_READ事件注册到主Selector中,然后主Selector执行select操作,遍历出可以读数据的socket,并从Worker线程池中拿到可用的Worker线程,然后将socket传递给Worker。整个过程是典型的NIO实现。 
Worker 
Worker线程拿到Poller传过来的socket后,将socket封装在SocketProcessor对象中。然后从Http11ConnectionHandler中取出Http11NioProcessor对象,从Http11NioProcessor中调用CoyoteAdapter的逻辑,跟BIO实现一样。在Worker线程中,会完成从socket中读取http request,解析成HttpServletRequest对象,分派到相应的servlet并完成逻辑,然后将response通过socket发回client。在从socket中读数据和往socket中写数据的过程,并没有像典型的非阻塞的NIO的那样,注册OP_READ或OP_WRITE事件到主Selector,而是直接通过socket完成读写,这时是阻塞完成的,但是在timeout控制上,使用了NIO的Selector机制,但是这个Selector并不是Poller线程维护的主Selector,而是BlockPoller线程中维护的Selector,称之为辅Selector。 

转载地址:http://xzbeo.baihongyu.com/

你可能感兴趣的文章
T-SQL:GO语句和批处理
查看>>
算法参考资料(更新)
查看>>
Poj 水题
查看>>
php中关于mysqli和mysql区别的一些知识点分析
查看>>
Fiddler的基本介绍
查看>>
Mysql On Mac OS: Remove & Install
查看>>
莫烦大大keras学习Mnist识别(4)-----RNN
查看>>
STL之string插入
查看>>
mac 安装mysql
查看>>
cout internal
查看>>
分巧克力 蓝桥杯
查看>>
项目设计阶段的一些事
查看>>
centos 7 进入图形界面
查看>>
UIWebView
查看>>
贝叶斯分类
查看>>
在java中一种中文问题的解决办法
查看>>
Linux常用命令大全
查看>>
C 函数传参问题
查看>>
luoguP1064 金明的预算方案 (有依赖的背包问题)
查看>>
MongoDB聚合
查看>>