Skip to content

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源码深度解析