设为首页 收藏本站
查看: 492|回复: 0

[经验分享] tomcat 分配请求之——socket获取请求

[复制链接]

尚未签到

发表于 2017-1-30 15:07:44 | 显示全部楼层 |阅读模式
  首先,安装,调试tomcat的源码:
  http://smiky.iteye.com/blog/613151
  写得很全。
  =========================================================
     主要描述下 tomcat如何接收请求,并分发处理的,里面有一些线程处理的细节。挺值得品味的

  
  tomcat 等待用户请求的类:

protected class Acceptor implements Runnable {
/**
* The background thread that listens for incoming TCP/IP connections and hands them off to an appropriate
* processor.
*/
public void run() {
// Loop until we receive a shutdown command
while (running) {
// Loop if endpoint is paused
while (paused) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// Ignore
}
}
// Accept the next incoming connection from the server socket
try {
// 这里等待用户的请求进入,线程会阻塞,直到等到用户的请求为止
Socket socket = serverSocketFactory.acceptSocket(serverSocket);
serverSocketFactory.initSocket(socket);
// Hand this socket off to an appropriate processor
if (!processSocket(socket)) {
// Close socket right away
try {
socket.close();
} catch (IOException e) {
// Ignore
}
}
} catch (IOException x) {
if (running) log.error(sm.getString("endpoint.accept.fail"), x);
} catch (Throwable t) {
log.error(sm.getString("endpoint.accept.fail"), t);
}
// The processor will recycle itself when it finishes
}
}
}
  processSocket方法:

    /**
* Process given socket.
*/
protected boolean processSocket(Socket socket) {
try {
if (executor == null) {
// 没有线程池队列,从WorkStack中获取一个,并分配给他做操作(WorkStack相当于线程池的作用)
getWorkerThread().assign(socket);
} else {
// 有线程池队列,直接new 一个SocketProcessor对这个socket连接做处理
executor.execute(new SocketProcessor(socket));
}
} catch (Throwable t) {
// This means we got an OOM or similar creating a thread, or that
// the pool and its queue are full
log.error(sm.getString("endpoint.process.fail"), t);
return false;
}
return true;
}
  工人类:

protected class Worker implements Runnable {
protected Thread  thread    = null;
protected boolean available = false;
protected Socket  socket    = null;
/**
* Process an incoming TCP/IP connection on the specified socket. Any exception that occurs during processing
* must be logged and swallowed. <b>NOTE</b>: This method is called from our Connector's thread. We must assign
* it to our own thread so that multiple simultaneous requests can be handled.
*
* @param socket TCP socket to process
*/
synchronized void assign(Socket socket) {
// Wait for the Processor to get the previous Socket
while (available) {
// 当前Worker是否处于可用状态
try {
wait();
} catch (InterruptedException e) {
}
}
// Store the newly available Socket and notify our thread
this.socket = socket;
available = true;
notifyAll();
}
/**
* Await a newly assigned Socket from our Connector, or <code>null</code> if we are supposed to shut down.
*/
private synchronized Socket await() {
// 如果处于闲置状态,就等待新的任务分配
while (!available) {
try {
wait();
} catch (InterruptedException e) {
}
}
// Notify the Connector that we have received this Socket
Socket socket = this.socket;
available = false;
notifyAll();
return (socket);
}
/**
* The background thread that listens for incoming TCP/IP connections and hands them off to an appropriate
* processor.
*/
public void run() {
// Process requests until we receive a shutdown signal
while (running) {
// Wait for the next socket to be assigned
Socket socket = await();
if (socket == null) continue;
// 处理该次请求
if (!setSocketOptions(socket) || !handler.process(socket)) {
// Close socket
try {
socket.close();
} catch (IOException e) {
}
}
// Finish up this request
socket = null;
// 回收该线程池的使用
recycleWorkerThread(this);
}
}
  以上代码的大致示意图:
  
DSC0000.bmp

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-335450-1-1.html 上篇帖子: java/eclipse/tomcat版本号简介 下篇帖子: 解析Tomcat下应用JMS开发技巧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表