- 浏览: 243627 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
feifei435:
不错的文章,但是有一点忘了提,创建了新的sessionid后, ...
Tomcat的Session管理(一) - Session的生成 -
yangcheng33:
博主你为什么这么棒!!!
Tomcat的Session管理(一) - Session的生成 -
u010323779:
哈哈,非常不错,昨天看了一天源代码,不知从何入手,现在看来您的 ...
Tomcat的Session管理(二) - Session后台处理 -
hdwmp123:
...
Tomcat请求处理(一) -- 服务器端口监听 -
tinguo002:
...
Tomcat的Session管理(一) - Session的生成
这里主要讲一下Tomcat使用NIO启动和进行请求处理的大致流程,使用的源码版本是7.0.5,对于其他处理等流程就不写了,我在别的文章里已经大致写过了,不过是用的6.0版本:http://zddava.iteye.com/category/53603。
当Tomcat配置成使用NIO时,启动过程其实和过去差不多,也是Connector#startInternal -> Protocol(Http11NioProtocol)#start() -> Endpoint(NioEndPoint)#start()的过程,这里主要看一下NioEndPoint:
这里先看一下init()方法,没有全列出来,最主要的一点就是初始化ServerSocketChannel:
Tomcat每种Endpoint的Acceptor线程其实作用都一样,对来访的请求进行最初的处理之用,NioEndpoint的Acceptor也不例外,它内部也只定义一个继承自Runnable的方法:
方法其实挺容易理解,就是得到请求用的SocketChannel后交给Poller处理,这里poll是一个UNIX的系统调用名字,Java开发者可以google下,我也是才准备开始啃《UNIX网络编程》,闲言少叙,看一下#setSocketOptions()方法吧:
好了,终于到了Poller了,下一篇开始Poller。
当Tomcat配置成使用NIO时,启动过程其实和过去差不多,也是Connector#startInternal -> Protocol(Http11NioProtocol)#start() -> Endpoint(NioEndPoint)#start()的过程,这里主要看一下NioEndPoint:
public void start() throws Exception { // 初始化 if (!initialized) { init(); } if (!running) { running = true; paused = false; // 创建一个ThreadPoolExecutor对象,和JDK里的功能一样,只不过进行了一些扩展 if (getExecutor() == null) { createExecutor(); } // 开启poll的线程 pollers = new Poller[getPollerThreadCount()]; for (int i = 0; i < pollers.length; i++) { pollers[i] = new Poller(); Thread pollerThread = new Thread(pollers[i], getName() + "-ClientPoller-" + i); pollerThread.setPriority(threadPriority); pollerThread.setDaemon(true); pollerThread.start(); } // 开启Acceptor的线程 for (int i = 0; i < acceptorThreadCount; i++) { Thread acceptorThread = new Thread(new Acceptor(), getName() + "-Acceptor-" + i); acceptorThread.setPriority(threadPriority); acceptorThread.setDaemon(getDaemon()); acceptorThread.start(); } } }
这里先看一下init()方法,没有全列出来,最主要的一点就是初始化ServerSocketChannel:
public void init() throws Exception { if (initialized) return; // 初始化ServerSocketChannel,这里用的是阻塞的方式,没有用Selector serverSock = ServerSocketChannel.open(); socketProperties.setProperties(serverSock.socket()); InetSocketAddress addr = (getAddress() != null ? new InetSocketAddress(getAddress(), getPort()) : new InetSocketAddress(getPort())); serverSock.socket().bind(addr, getBacklog()); serverSock.configureBlocking(true); // mimic APR behavior serverSock.socket().setSoTimeout(getSocketProperties().getSoTimeout()); ...... }
Tomcat每种Endpoint的Acceptor线程其实作用都一样,对来访的请求进行最初的处理之用,NioEndpoint的Acceptor也不例外,它内部也只定义一个继承自Runnable的方法:
public void run() { while (running) { while (paused && running) { try { Thread.sleep(1000); } catch (InterruptedException e) { // Ignore } } if (!running) { break; } try { // 接受请求 SocketChannel socket = serverSock.accept(); if ( running && (!paused) && socket != null ) { // 将SocketChannel给pollor处理 if (!setSocketOptions(socket)) { try { socket.socket().close(); socket.close(); } catch (IOException ix) { if (log.isDebugEnabled()) log.debug("", ix); } } } } catch (SocketTimeoutException sx) { //normal condition } catch (IOException x) { if (running) { log.error(sm.getString("endpoint.accept.fail"), x); } } catch (OutOfMemoryError oom) { try { oomParachuteData = null; releaseCaches(); log.error("", oom); }catch ( Throwable oomt ) { try { try { System.err.println(oomParachuteMsg); oomt.printStackTrace(); }catch (Throwable letsHopeWeDontGetHere){ ExceptionUtils.handleThrowable(letsHopeWeDontGetHere); } }catch (Throwable letsHopeWeDontGetHere){ ExceptionUtils.handleThrowable(letsHopeWeDontGetHere); } } } catch (Throwable t) { ExceptionUtils.handleThrowable(t); log.error(sm.getString("endpoint.accept.fail"), t); } } } }
方法其实挺容易理解,就是得到请求用的SocketChannel后交给Poller处理,这里poll是一个UNIX的系统调用名字,Java开发者可以google下,我也是才准备开始啃《UNIX网络编程》,闲言少叙,看一下#setSocketOptions()方法吧:
protected boolean setSocketOptions(SocketChannel socket) { // Process the connection try { // disable blocking, APR style, we are gonna be polling it // 这里终于看到了印象中的NIO的影子了 socket.configureBlocking(false); Socket sock = socket.socket(); socketProperties.setProperties(sock); // NioChannel是ByteChannel的子类 // 从队列里取出第一个可用的Channel,这样的话NioChannel应该是设计成非GC的 // 感觉其目的主要是对SocketChannel进行下封装 NioChannel channel = nioChannels.poll(); if (channel == null) { // 不过这里如果没有可用的就初始化一个的话请求数陡然增高再慢慢回落的时候不就浪费了内存了吗? // NioBufferHandler里分别分配了读缓冲区和写缓冲区 // SSL setup if (sslContext != null) { SSLEngine engine = createSSLEngine(); int appbufsize = engine.getSession().getApplicationBufferSize(); NioBufferHandler bufhandler = new NioBufferHandler(Math.max(appbufsize, socketProperties.getAppReadBufSize()), Math.max(appbufsize, socketProperties.getAppWriteBufSize()), socketProperties.getDirectBuffer()); channel = new SecureNioChannel(socket, engine, bufhandler, selectorPool); } else { // normal tcp setup NioBufferHandler bufhandler = new NioBufferHandler(socketProperties.getAppReadBufSize(), socketProperties.getAppWriteBufSize(), socketProperties.getDirectBuffer()); channel = new NioChannel(socket, bufhandler); } } else { // 这里就是对Channel的重用了 channel.setIOChannel(socket); if (channel instanceof SecureNioChannel) { SSLEngine engine = createSSLEngine(); ((SecureNioChannel) channel).reset(engine); } else { channel.reset(); } } // 这里就是将SocketChannel注册到Poller了。 // getPoller0用的循环的方式来返回Poller,即Poller 1, 2, 3... n 然后再回到1, 2, 3.... getPoller0().register(channel); } catch (Throwable t) { ExceptionUtils.handleThrowable(t); try { log.error("", t); } catch (Throwable tt) { ExceptionUtils.handleThrowable(t); } // Tell to close the socket return false; } return true; }
好了,终于到了Poller了,下一篇开始Poller。
发表评论
-
Tomcat NIO源代码分析(三) -- Protocol和Processor
2010-12-09 09:39 3037现在请求到了Protocol(Http11NioProtoco ... -
Tomcat NIO源代码分析(二) -- Poller
2010-12-08 08:46 4522接着上面的流程,现在请求到了Poller的#register( ... -
Tomcat的Session管理(二) - Session后台处理
2009-01-06 18:57 11038Tomcat会开启一个后台线程每隔一段时间检查Session的 ... -
Tomcat的Session管理(一) - Session的生成
2009-01-06 17:03 38388Session对象的创建一般是源于这样的一条语句: Sess ... -
Tomcat请求处理(七) - Servlet实例的调用
2009-01-05 17:09 5488Tomcat请求处理中Servlet实例的调用是和Filter ... -
Tomcat请求处理(六) -- Servlet实例创建
2009-01-04 19:02 4944首先,来看一下Servlet的载入过程。 具体是在org.a ... -
Tomcat请求处理(五) -- 请求在容器间的流动
2008-12-28 13:54 4005请求在Tomcat中传到了CoyoteAdapter的#ser ... -
Tomcat请求处理(四) -- Request, Response, 和Pipeline
2008-12-25 18:24 35591. Request和Response 当处理请求的时候,T ... -
Tomcat请求处理(三) -- coyote请求处理
2008-12-19 00:51 6237在上一篇文章文章中,Tomcat的请求处理到了JIoEndpo ... -
Tomcat请求处理(二) -- 请求处理框架
2008-11-03 10:05 3828书接上文。 当Tomcat的Acceptor监听到有请求到来 ... -
Tomcat请求处理(一) -- 服务器端口监听
2008-10-31 15:14 6841其实tomcat在哪个类中监听请求的代码很容易找到: 在or ... -
Tomcat启动部分源代码分析(五) -- 应用程序加载
2008-10-30 19:10 2501前面所叙述的tomcat启动中并没有webapps下边应用程序 ... -
Tomcat启动部分源代码分析(四) -- 开启容器
2008-10-28 12:23 2332四. 开启容器 最后是Bootstrap#start()方法 ... -
Tomcat启动部分源代码分析(三) -- 载入
2008-10-28 12:21 3080二. 载入 2. Bootstrap的#Bootstrap# ... -
Tomcat启动部分源代码分析(二) -- 初始化
2008-10-28 12:17 5521二. 初始化 1. 首先是Boo ... -
Tomcat启动部分源代码分析(一) -- 概览
2008-10-28 12:10 3776一. 概览 本文所涉及的Tomcat为6.0版本。 Tom ...
相关推荐
本篇文章将主要围绕“Tomcat源代码学习研究”这一主题,探讨Tomcat的核心概念、设计模式以及关键组件的底层实现原理。 1. **核心概念** - **Servlet**:Servlet是Java提供的一种服务器端编程接口,Tomcat通过...
3. **Jasper**:Jasper是Tomcat中的JSP编译器,负责将JSP文件转换为Java源代码,然后编译成Servlet。这一过程使得JSP能够像普通的Java类一样执行。 深入Tomcat源码,我们可以学习到以下关键知识点: 1. **Web应用...
当JSP文件被请求时,Jasper将其转换为Java源代码,再编译成Servlet,最后由Catalina调用执行。Jasper还支持JSP的预编译,提高应用启动速度。 5. **线程模型与并发** Tomcat采用两种线程模型:基于线程池的BIO...
JSP页面在第一次被请求时会被转换为Servlet源代码,然后编译为字节码。Jasper还负责跟踪JSP页面的修改,以便在变化时重新编译。 4. **Coyote处理HTTP连接** Coyote是Tomcat的网络通信模块,负责接收和响应HTTP...
springboot项目基于协同过滤算法的私人诊所管理系统_to,含有完整的源码和报告文档
图表分类ppt
09-办公人物信息可编辑PPT图表
推送早安问候以及天气预报
西门子1200PLC博图自动称重配料系统程序例程,组态画面采用KTP1200触摸屏。 具体为1200和变频器Modbus RTU 通 讯,托利多电子称modbus RTU通讯,带 PID 温度控制程序。 变频器参数 Modbus通讯说明 CAD电气图纸 硬件组态过程有内部教案等项目文件,程序打开软件版本TIA V14及以上
S7-200 PLC和组态王物分拣快递分拣分选包裹 带解释的梯形图程序,接线图原理图图纸,io分配,组态画面
图表分类ppt
图表分类ppt
图表分类ppt
springboot项目基于 html 的图书管理系统,含有完整的源码和报告文档
苍鹰优化算法NGO优化BP神经网络的软值和阈值参数做多输入单输出的分类建模。 程序内注释详细直接替数据就可以使用。 程序语言为matlab。 程序直接运行可以出分类图,迭代优化图,ROC图。
资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
GoPay.rar,GoPay.rar,GoPay.rar
该资源内项目源码是个人的课程设计、毕业设计,包含论文,拿来就能用的,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
图表分类ppt
springboot项目基于SpringBoot+Vue疫情物资捐赠和分配系统,含有完整的源码和报告文档