tomcat启动(六)Catalina分析-StandardServer.start()

上一篇分析到:Http11NioProcessor.process(SocketWrapper<S> socketWrapper)会将请求进行转换成生成request,和response对象,然后调用CoyoteAdapter.service(request,response)传递请求给对应的上下文

初始化构造方法

public Http11NioProcessor(int maxHttpHeaderSize, boolean rejectIllegalHeaderName,
NioEndpoint endpoint, int maxTrailerSize, Set<String> allowedTrailerHeaders,
int maxExtensionSize, int maxSwallowSize)

Http11NioProcessor这个对象生成是由createProcessor()生成了

@Override
public Http11NioProcessor createProcessor() {
Http11NioProcessor processor = new Http11NioProcessor(
proto.getMaxHttpHeaderSize(), proto.getRejectIllegalHeaderName(),
(NioEndpoint)proto.endpoint, proto.getMaxTrailerSize(),
proto.getAllowedTrailerHeadersAsSet(), proto.getMaxExtensionSize(),
proto.getMaxSwallowSize());
proto.configureProcessor(processor);
register(processor);
return processor;
}

构造参数都是由proto对象提供,这个对象是表示Http11NioProtocol

para1:
private int maxHttpHeaderSize = 8 * 1024;
para2:
private boolean rejectIllegalHeaderName = false;
para3:
NioEndpoint ;略。
para4:以尾部为标题的最大大小,字节为单位
private int maxTrailerSize = 8192;
para5:允许通过尾部发送的标头名称。它们以小写形式存储。
private Set<String> allowedTrailerHeaders =
Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());
para6:分块编码中扩展信息的最大大小
private int maxExtensionSize = 8192;
para7:Maximum amount of request body to swallow
private int maxSwallowSize = 2 * 1024 * 1024;

再看下构造方法里究竟干了神马

Http11NioProcessor
public Http11NioProcessor(int maxHttpHeaderSize, boolean rejectIllegalHeaderName,
NioEndpoint endpoint, int maxTrailerSize, Set<String> allowedTrailerHeaders,
int maxExtensionSize, int maxSwallowSize) { super(endpoint); inputBuffer = new InternalNioInputBuffer(request, maxHttpHeaderSize,
rejectIllegalHeaderName);
request.setInputBuffer(inputBuffer); outputBuffer = new InternalNioOutputBuffer(response, maxHttpHeaderSize);
response.setOutputBuffer(outputBuffer); initializeFilters(maxTrailerSize, allowedTrailerHeaders, maxExtensionSize, maxSwallowSize);
}

super(endpoint)

public AbstractHttp11Processor(AbstractEndpoint<S> endpoint) {
super(endpoint);
userDataHelper = new UserDataHelper(getLog());
}

继续super(endpoint)

public AbstractProcessor(AbstractEndpoint<S> endpoint) {
this.endpoint = endpoint;
asyncStateMachine = new AsyncStateMachine(this);
request = new Request();
response = new Response();
response.setHook(this);
request.setResponse(response);
request.setHook(this);
}

到这里就可以知道了。原来就是初始化org.apache.coyote.Request、org.apache.coyote.Response、InternalNioInputBuffer、InternalNioOutputBuffer对象

InputBuffer和request匹配。OutputBuffer和response匹配。

注意:

request.setInputBuffer(inputBuffer);

request关联的inputbuffer对象与我们线程接收到的socket相关联。这里相当于完成的request初始化。最后会传递到对应的context

初始化完后,接着看Http11NioProcessor.process

/**
* Process pipelined HTTP requests using the specified input and output
* streams.
*
* @param socketWrapper Socket from which the HTTP requests will be read
* and the HTTP responses will be written.
*
* @throws IOException error during an I/O operation
*/
@Override
public SocketState process(SocketWrapper<S> socketWrapper){
RequestInfo rp = request.getRequestProcessor();
rp.setStage(org.apache.coyote.Constants.STAGE_PARSE);
// Setting up the I/O解析阶段
setSocketWrapper(socketWrapper);
getInputBuffer().init(socketWrapper, endpoint);
getOutputBuffer().init(socketWrapper, endpoint);



if (!getErrorState().isError()) {
// Setting up filters, and parse some request headers
、、准备阶段 rp.setStage(org.apache.coyote.Constants.STAGE_PREPARE);
try {
prepareRequest();
}



// Process the request in the adapter
if (!getErrorState().isError()) {
try {
、、、请求处理阶段 rp.setStage(org.apache.coyote.Constants.STAGE_SERVICE);
getAdapter().service(request, response);



// Finish the handling of the request
rp.setStage(org.apache.coyote.Constants.STAGE_ENDINPUT);
endRequest();


。后面阶段省略
rp.setStage(org.apache.coyote.Constants.STAGE_ENDOUTPUT);
rp.setStage(org.apache.coyote.Constants.STAGE_KEEPALIVE);
rp.setStage(org.apache.coyote.Constants.STAGE_ENDED);

从解析阶段

getInputBuffer().init(socketWrapper, endpoint);从socket中获取inputBuffer,初始化一个SocketInputBuffer对象来执行doRead()进行读操作
getOutputBuffer().init(socketWrapper, endpoint);从socket中获取outputBuffer,初始化一个SocketOutputBuffer对象来执行doWrite()进行写操作

请求处理阶段。(重点)

getAdapter().service(request, response);

到这里就是将请求转发到对应context处理的。请求初始化在Http11NioProcessor类的构造方法中可以看到。

tomcat启动(Ⅶ)请求处理--Processor.process(SocketWrapper<S> socketWrapper)的更多相关文章

  1. Tomcat启动 Unable to process Jar entry [javassist/XXXXXX.class]

    例如: 03-Mar-2017 17:01:45.864 SEVERE [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.startup.Co ...

  2. spring tomcat启动 请求处理

    onRefresh(); protected void onRefresh() { try { createEmbeddedServletContainer(); } } private void c ...

  3. Tomcat 启动报错SEVERE: Unable to process Jar entry [javassist/util/proxy/SerializedProxy$1.class]

    错误信息 springboot + spring mvc 的maven项目,在tomcat启动的时候报错,错误信息如下: SEVERE: Unable to process Jar entry [ja ...

  4. Tomcat启动和请求处理解析

    tomcat是我们经常使用的组件,但是内部是如何运行的呢,我们去一探究竟. 1.tomcat架构 tomcat的整体架构图如下: Tomcat中只有一个Server,一个Server可以有多个Serv ...

  5. tomcat启动(六)Catalina分析-StandardServer.start()

    从链接 Tomcat中组件的生命周期管理公共接口Lifecycle 可以知道调用的是StandardServer.startInternal() @Override protected void st ...

  6. Tomcat启动流程简析

    Tomcat是一款我们平时开发过程中最常用到的Servlet容器.本系列博客会记录Tomcat的整体架构.主要组件.IO线程模型.请求在Tomcat内部的流转过程以及一些Tomcat调优的相关知识. ...

  7. How Tomcat works — 五、tomcat启动(4)

    前面摆了三节的姿势,现在终于要看到最终tomcat监听端口,接收请求了. 目录 Connector Http11Protocol JIoEndpoint 总结 在前面的初始化都完成之后,进行Conne ...

  8. 如何在tomcat启动的时候运行一个Java类

    设置个Listener就好了,在web.xml中指定描述. web.xml其实就是tomcat启动的时候会读取的一个描述文件,比如访问服务器的时候首页等都可以在里面指定,有相应的tag.这里有解释:h ...

  9. 远程控制TOMCAT启动

    远程控制TOMCAT启动 1.在tomcat/conf/tomcat-users.xml中配置好管理员帐号和密码.    2.在浏览器中输入:http://你的ip/manager/list.     ...

随机推荐

  1. Android-AppUtils工具类

    常用APP的工具类,包含版本号.版本名称.安装的应用程序ICON public class AppUtils { private AppUtils(){} /** * 设置状态栏的颜色 * @para ...

  2. Java面向接口编程【精品博客】

    我们从生活中去理解面向接口编程,以下举例四个案例来理解: 案例一(汽车案例): /** * 汽车标准接口 * @author Liudeli */ public interface ICar { /* ...

  3. GitLab使用自定义端口

      Git支持两种地址访问方式,一种是:使用ssh协议,另一种是:使用http协议.   今天在部署Git服务器拉取和上传代码是出现了以下问题ssh: connect to host gitlab.d ...

  4. [ACM_数据结构] 线段树模板

    #include<iostream> #include<cmath> using namespace std; #define maxn 200005 class Node{ ...

  5. 设计模式之状态模式(State Pattern)

    一.什么是状态模式? 把所有动作都封装在状态对象中,状态持有者将行为委托给当前状态对象 也就是说,状态持有者(比如汽车,电视,ATM机都有多个状态)并不知道动作细节,状态持有者只关心自己当前所处的状态 ...

  6. C#实现墨卡托投影坐标系经纬度与米制单位之间的互转

    using System; using GeoJSON.Net.Geometry; namespace GISWebService.Common { /// <summary> /// 墨 ...

  7. Android TV Overscan

    本文来自网易云社区 作者:孙有军 开发的TV应用发现在部分电视上可以显示完整,而其他部分电视显示不全,周围都会遮挡了. 原因 这是因为部分老的电视有一个overscan的概览,什么叫overscan呐 ...

  8. JVM内存回收区域+对象存活的判断+引用类型+垃圾回收线程

    此文已由作者赵计刚薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 注意:本文主要参考自<深入理解Java虚拟机(第二版)> 说明:查看本文之前,推荐先知道JVM ...

  9. JavaScript学习知识点归纳

    JavaScript学习包括几大方面: 1.基础语法 2.JavaScript核心对象 3.DOM操作 4.BOM操作 5.正则表达式 6.AJAX 7.面向对象编程 以下依次为各版块相关内容==&g ...

  10. python 十进制 和 IP 地址互转

    #! /bin/python def ip2decimalism(ip): dec_value = 0 v_list = ip.split('.') v_list.reverse() t = 1 fo ...