Tomcat请求处理二请求处理框架Word下载.docx
- 文档编号:20287987
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:7
- 大小:16.28KB
Tomcat请求处理二请求处理框架Word下载.docx
《Tomcat请求处理二请求处理框架Word下载.docx》由会员分享,可在线阅读,更多相关《Tomcat请求处理二请求处理框架Word下载.docx(7页珍藏版)》请在冰豆网上搜索。
//初始化Socket
serverSocketFactory.initSocket(socket;
//处理Socket
if(!
processSocket(socket{
socket.close(;
}catch(IOExceptione{
}catch(IOExceptionx{
if(running
log.error(sm.getString("
endpoint.accept.fail"
x;
}catch(Throwablet{
t;
结束阻塞后,首先是Socket的初始化,由于ServerSocketFactory的实现类DefaultServerSocketFactory并没有扩展initSocket(方法,所以这一步其实是什么都没做的。
接下来程序执行到了.JIoEndpoint.processSocket(socket;
这一步了,这个方法的源代码如下所示:
protectedbooleanprocessSocket(Socketsocket{
if(executor==null{
//得到一个Work并为它分配这个Socket
getWorkerThread(.assign(socket;
}else{
executor.execute(newSocketProcessor(socket;
endpoint.process.fail"
returnfalse;
returntrue;
hxzon:
这里提供了jdk5executor+SocketProcessor和tomcat自己的worker实现。
使用jdk5executor简洁许多。
executor是一个外部的基于线程池的执行器,先不去考虑它,重点看一下getWorkerThread(和Worker#assign(
getWorkerThread(的源代码如下:
protectedWorkergetWorkerThread({
//获取一个Worker
WorkerworkerThread=createWorkerThread(;
while(workerThread==null{//如果获取的Worker为Null
synchronized(workers{
//等待workers里边Worker的回收,recycleWorkerThread(中会调用notify通知这个线程结束等待的
workers.wait(;
//等待结束,再次获取一个Worker
workerThread=createWorkerThread(;
returnworkerThread;
这里这个createWorkerThread(也就是获取Worker的方法值得研究一下。
protectedWorkercreateWorkerThread({
if(workers.size(>
0{//如果堆栈中有剩余的Worker
//当前在使用的Worker线程计数
curThreadsBusy++;
//将一个Worker推出堆栈
returnworkers.pop(;
//如果堆栈中没有多余的Worker了,那么创建一个。
if((maxThreads>
0&
&
(curThreads<
maxThreads{
//如果maxThreads有定义,并且当前的Worker数量小于这个值。
//在recycleWorkerThread(中会将新创建的Worker放入堆栈的
return(newWorkerThread(;
if(maxThreads<
0{
//maxThreads没有定义,可以有无限个Worker的情况。
return(null;
而newWorkerThread(方法还是很好理解的:
protectedWorkernewWorkerThread({
WorkerworkerThread=newWorker(;
workerThread.start(;
return(workerThread;
创建一个Worker线程,并且开启线程。
经过上述的过程,就获得了一个Worker(并且已经开始运行了,那么程序的下一步是调用Worker的assign(方法:
synchronizedvoidassign(Socketsocket{
//等待获取完上一个Socket
while(available{
wait(;
//保存新的Socket
this.socket=socket;
available=true;
notifyAll(;
这样新的Worker已经有一个Socket对象去处理了,下面来看一下Worker的线程中做了哪些工作。
//知道收到停止信号,否则一直循环
//等待为这个线程设置一个Socket对象
Socketsocket=await(;
if(socket==null
continue;
//处理请求
setSocketOptions(socket||!
handler.process(socket{//关闭Socket
//回收Worker
socket=null;
recycleWorkerThread(this;
其中await(用于等待有Socket对象赋给当前的Worker已进行请求处理,代码如下:
privatesynchronizedSocketawait({
//等待获取Socket
while(!
available{
//Socket已经收到
Socketsocket=this.socket;
available=false;
//这个notifyAll(是通知assign(中的等待Socket的处理已经开始了,//可以为这个Worker赋新的值了。
return(socket;
而setSocketOptions(用于设定一些Socket的参数,如下所示:
protectedbooleansetSocketOptions(Socketsocket{
intstep=1;
if(soLinger>
=0{
socket.setSoLinger(true,soLinger;
if(tcpNoDelay{
socket.setTcpNoDelay(tcpNoDelay;
if(soTimeout>
socket.setSoTimeout(soTimeout;
step=2;
serverSocketFactory.handshake(socket;
if(log.isDebugEnabled({
if(step==2{
log.debug(sm.getString("
endpoint.err.handshake"
}else{
endpoint.err.unexpected"
}
handler.process(socket封装了处理请求的全过程,下次再详细了解
而最后的recycleWorkerThread(用于回收Worker到堆栈中以备下次使用:
protectedvoidrecycleWorkerThread(WorkerworkerThread{synchronized(workers{
workers.push(workerThread;
curThreadsBusy--;
workers.notify(;
好了,请求处理的整个流程大致就是这样的,下次再详细了解请求的真实处理部分,就是handler.process(socket的内容。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Tomcat 请求 处理 框架