Tomcat请求处理
深入理解Tomcat的请求处理流程,掌握从接收到响应的完整过程,理解请求解析、容器处理、响应返回等核心机制。
📋 请求处理概览
Tomcat的请求处理是一个复杂的流程,涉及多个组件的协作。
🎯 一、请求接收
1.1 Acceptor
Acceptor线程:
java
protected class Acceptor extends AbstractEndpoint.Acceptor {
@Override
public void run() {
while (endpoint.isRunning()) {
try {
countUpOrAwaitConnection();
Socket socket = null;
try {
socket = endpoint.serverSocketAccept();
} catch (Exception e) {
// ...
}
if (!endpoint.isRunning()) {
break;
}
state = AcceptorState.RUNNING;
if (!endpoint.setSocketOptions(socket)) {
closeSocket(socket);
}
} catch (Throwable t) {
// ...
}
}
state = AcceptorState.ENDED;
}
}1.2 连接处理
setSocketOptions:
java
protected boolean setSocketOptions(Socket socket) {
try {
socket.setTcpNoDelay(getTcpNoDelay());
socket.setKeepAlive(getSoKeepAlive());
socket.setSoTimeout(getConnectionTimeout());
socket.setSoLinger(getSoLingerOn(), getSoLingerTime());
socket.setPerformancePreferences(getPerformanceConnectionTime(),
getPerformanceLatency(), getPerformanceBandwidth());
NioChannel channel = nioChannels.pop();
if (channel == null) {
SocketBufferHandler bufhandler = new SocketBufferHandler(
getSocketBufferSize(), getSocketBufferSize(),
getDirectSocketBuffer());
channel = new NioChannel(socket, bufhandler);
} else {
channel.setSocketChannel(socket);
channel.reset();
}
getPoller().register(channel);
} catch (Throwable t) {
// ...
return false;
}
return true;
}🎯 二、请求解析
2.1 HTTP解析
Http11Processor:
java
@Override
protected void service(org.apache.coyote.Request req,
org.apache.coyote.Response res) throws Exception {
Request request = (Request) req.getNote(ADAPTER_NOTES);
Response response = (Response) res.getNote(ADAPTER_NOTES);
if (Boolean.TRUE.equals(req.getAttribute(
org.apache.coyote.Constants.SENDFILE_SUPPORTED_ATTR))) {
req.getRequestProcessor().setSendfile(
response.getSendfile());
}
boolean async = false;
boolean postParseSuccess = false;
req.getRequestProcessor().setWorkerThreadName(
Thread.currentThread().getName());
try {
req.getRequestProcessor().setStage(
org.apache.coyote.Constants.STAGE_PARSE);
postParseSuccess = postParseRequest(req, request, response);
if (postParseSuccess) {
req.getRequestProcessor().setStage(
org.apache.coyote.Constants.STAGE_PREPARE);
adapter.service(request, response);
if (!async) {
req.getRequestProcessor().setStage(
org.apache.coyote.Constants.STAGE_SERVICE);
}
}
} catch (Exception e) {
// ...
}
}🎯 三、容器处理
3.1 容器层次
容器处理流程:
3.2 StandardEngineValve
StandardEngineValve.invoke:
java
@Override
public final void invoke(Request request, Response response)
throws IOException, ServletException {
Host host = request.getHost();
if (host == null) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST,
sm.getString("standardEngine.noHost",
request.getServerName()));
return;
}
if (request.isAsyncSupported()) {
request.setAsyncSupported(host.getPipeline().isAsyncSupported());
}
host.getPipeline().getFirst().invoke(request, response);
}📖 学习资源
视频教程
书籍推荐
- 《Tomcat架构解析》 - 刘光瑞
网站资源
✅ 学习检查清单
- [ ] 已理解请求接收机制
- [ ] 已理解请求解析流程
- [ ] 已理解容器处理流程
- [ ] 已理解响应返回机制
- [ ] 已绘制请求处理流程图
- [ ] 已总结核心知识点
上一章节:MyBatis缓存机制
下一章节:Tomcat连接器
返回目录:Mybatis和Tomcat源码深度解析