• Tomcat 7 Connector 精读(2) CoyoteAdapter


    这个适配器类只讲2个方法,构造方法中我们看到一个适配器对象有自己关联的连接器类。

    其中Service的重要任务就是讲客户端端请求交给容器。

    public 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 (request == null) {
    
                // Create objects
                request = connector.createRequest();
                request.setCoyoteRequest(req);
                response = connector.createResponse();
                response.setCoyoteResponse(res);
    
                // Link objects
                request.setResponse(response);
                response.setRequest(request);
    
                // Set as notes
                req.setNote(ADAPTER_NOTES, request);
                res.setNote(ADAPTER_NOTES, response);
    
                // Set query string encoding
                req.getParameters().setQueryStringEncoding
                    (connector.getURIEncoding());
    
            }
    
           
    
                    connector.getService().getContainer().getPipeline().getFirst().invoke(request, response);
    //最终的方法,获得连接器-->服务--》容器-》管道---》第一个value
                   
                    }
    
                }
                AsyncContextImpl asyncConImpl = (AsyncContextImpl)request.getAsyncContext();
                if (asyncConImpl != null) {
                    async = true;
                    ReadListener readListener = req.getReadListener();
                    if (readListener != null && request.isFinished()) {
                        // Possible the all data may have been read during service()
                        // method so this needs to be checked here
                        ClassLoader oldCL =
                                Thread.currentThread().getContextClassLoader();
                        ClassLoader newCL =
                                request.getContext().getLoader().getClassLoader();
                        try {
                            Thread.currentThread().setContextClassLoader(newCL);
                            if (req.sendAllDataReadEvent()) {
                                req.getReadListener().onAllDataRead();
                            }
                        } finally {
                            Thread.currentThread().setContextClassLoader(oldCL);
                        }
                    }
                } else if (!comet) {
                    request.finishRequest();
                    response.finishResponse();
                    if (postParseSuccess &&
                            request.getMappingData().context != null) {
                        // Log only if processing was invoked.
                        // If postParseRequest() failed, it has already logged it.
                        // If context is null this was the start of a comet request
                        // that failed and has already been logged.
                        request.getMappingData().context.logAccess(
                                request, response,
                                System.currentTimeMillis() - req.getStartTime(),
                                false);
                    }
                }
    
            } catch (IOException e) {
                // Ignore
            } finally {
                req.getRequestProcessor().setWorkerThreadName(null);
                AtomicBoolean error = new AtomicBoolean(false);
                res.action(ActionCode.IS_ERROR, error);
                // Recycle the wrapper request and response
                if (!comet && !async || error.get()) {
                    request.recycle();
                    response.recycle();
                } else {
                    // Clear converters so that the minimum amount of memory
                    // is used by this processor
                    request.clearEncoders();
                    response.clearEncoders();
                }
            }
    
        }
  • 相关阅读:
    我的周记8——"因为相信,所以看见"
    我的周记7——“阳光开朗,自信表达一切”
    一些做设计挺不错的网站
    我的周记6——"不破楼兰誓不还“
    版本管理工具 Git
    我的周记5——"侵略如火,不动如山"
    SQLite-FMDatabase用法
    UIImage与Base64相互转换
    百度地图--地图标注的重复单击
    百度地图的单例模式
  • 原文地址:https://www.cnblogs.com/hansongjiang/p/4229772.html
Copyright © 2020-2023  润新知