首先,安装,调试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);
}
}
以上代码的大致示意图:
- 大小: 37.5 KB
分享到:
相关推荐
在这个系列的第三部分,我们将深入探讨Tomcat处理HTTP请求的核心组件——`Connector`类。`Connector`是Tomcat与外部世界交互的关键桥梁,负责接收并转发HTTP请求到内部的Servlet容器进行处理。 首先,我们来理解`...
然而,无论版本如何变化,Tomcat的核心理念——高效、可靠地处理Web请求——始终未变。 四、示例与实践 为了更好地理解Tomcat的工作原理,我们可以通过一个简单的Web服务器和servlet容器的实现来深入探讨。例如,...
在深入探讨Tomcat的具体实现前,我们需要了解其核心组件——Catalina模块的基本结构。Catalina是Tomcat的核心组件之一,负责处理HTTP请求。它通过一系列的层次结构来组织和管理Web应用,这些结构包括Server、Service...
首先需要了解Tomcat的配置文件——server.xml。它是Tomcat的核心配置文件,包含了多个子元素用于配置Tomcat的各个组件。server.xml文件中的主要元素包括、、和。其中,元素代表整个Catalina容器,是整个配置文件的根...
《Tomcat7.0性能优化——挑战极限精简版》 Tomcat作为一款广泛应用的开源Java Servlet容器,其性能优化是许多开发者关注的重点。本文将深入探讨如何对Tomcat7.0进行性能优化,旨在帮助你挑战其运行效率的极限。 一...
Tomcat是Apache软件基金会的Jakarta项目的一部分,它实现了Java Servlet、JavaServer Pages (JSP) 和Java EE的Web应用程序部分,即Java EE的轻量级版本——Java EE Web Profile。 Tomcat以其轻便、高效和易用性而...
6. **Socket编程与多线程**:在网络编程中,Socket编程用于实现客户端-服务器通信,而多线程则是处理并发请求和优化性能的重要手段。 7. **设计模式**:了解MVC模式、工厂模式、单例模式、接口模式和适配器模式,...
在这个项目中,Tomcat可能是用来运行Python编写的Web应用的一个环境,因为有些开发者可能会选择使用像Flask或Django这样的Python Web框架,并通过Wsgi(Web服务器网关接口)与Tomcat进行通信。这样,Python应用可以...
【标题】"Web引擎——简单到掉渣"的解析与探讨 在计算机科学领域,Web引擎是用于处理HTTP请求并返回HTML内容的核心组件,它是Web服务器的重要组成部分。本主题将深入浅出地介绍一个简单的Web引擎,以Java编程语言为...
【Servlet笔记】主要涵盖的是JavaWeb开发中的核心技术——Servlet的学习,它是Java EE(现在被称为Jakarta EE)体系中的一部分,用于构建服务器端的Web应用程序。Servlet是Java为处理HTTP请求而设计的一种API,它...
本篇文章将详细讲解如何在Eclipse下配置Windchill进行远程调试,以及涉及到的关键技术点——JPDA。 首先,我们需要在Tomcat服务器上进行配置以开启远程调试功能。在`Tomcat\config.properties`文件中,确保存在以下...
它不仅是SUN公司认证Java程序员(SCJP)与SUN公司认证Java开发员(SCJD)之间的显著区别之一——SCJP考试不涉及EJB内容,而SCJD则将其纳入考核范围;同时也是企业在基于J2EE平台开发电子商务应用系统时不可或缺的...
- **Tomcat服务器**:Java Web应用的常用服务器,部署和调试Web应用。 9. **Web开发基础** - **Servlet**:Java Web的核心,用于接收和响应HTTP请求。 - **JSP**:动态网页技术,结合HTML和Java代码。 - **MVC...
这个 `socket_timeout` 值决定了 mod_jk 对 Tomcat 的请求等待时间。由于设置为 5 分钟(300 秒),与 AJAX 请求执行的时间一致,导致了请求被重复发送。将这个值调整到一个更大的值,比如 10 分钟(600 秒),并...
随着需求的增长,出现了更高级别的抽象——JSP(Java Server Pages),它允许开发者将业务逻辑与视图层分离,提高了代码的可维护性和可读性。 #### Java EE体系介绍 Java EE是J2EE的后续版本,它进一步发展和完善...
5. 关闭连接:处理完请求后,关闭`Socket`和`ServerSocket`。 三、FTP服务器基础 FTP是用于Internet上的控制文件的双向传输。它包括两个子系统:控制连接和数据连接。FTP服务器需要管理用户认证、目录浏览、文件...