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. (线段树)敌兵布阵--hdu--1166 (入门)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1166 自己第一次在没有看题解AC出来的线段树,写的可能不是太好,再贴个学长的代码,学习一下 发现自己的U ...

  2. PO Release Final Closed 灾难恢复

    今天不小心 Final Closed了一条Po Release,只能通过后台更新数据恢复了. 更新后可接收可匹配,但不保证更新数据有遗漏,慎用. 更新前备份各表数据 UPDATE PO_LINE_LO ...

  3. WindowsPhone 8.1 语音命令资料

    快速入门:语音命令(XAML) http://msdn.microsoft.com/library/windows/apps/xaml/dn630430.aspx/ 语音命令元素和属性参考(XAML) ...

  4. 阉割版BBBlack安装Debian

    开门见山,直入主题 咸鱼入手3块阉割ARM板,经过快递近6天运输到手,不过价格便宜 东西下面这样的(借了咸鱼的图): 发现这块板是阉割版的国外beagleboard.org型号为BeagleBone ...

  5. 挂载Linux云主机硬盘到本地计算机

      现在移动硬盘已经是每个人的生活必需品了,当然网络也是我们生活的必需品,我们现在就是要用网络存储代替硬盘存储,当然再实际使用过程中需要考虑到以下两个问题: 网络延迟 云主机磁盘IO   以上两个关键 ...

  6. 使用Markdown语法画流程图

    Markdown流程图   鉴于本人使用的是马克飞象,所以一下以马克飞象为例: 语法   流程图的画法和代码块类似,流程图也是写在两个```之间的.格式用flow表示,例如: st=>start ...

  7. OC 数组以及字符串拼接与分割

    //@""空的字符串对象-------分割 NSString * ptr = @"I am a man"; NSArray * array = [ptr com ...

  8. ACTGame项目

    项目地址:https://github.com/alonecat06/ACTGame游戏地址:http://pan.baidu.com/s/1hqD3IYw 项目是一个自制单机动作游戏demo,方向是 ...

  9. OI动态规划&&优化 简单学习笔记

    持续更新!! DP的难点主要分为两类,一类以状态设计为难点,一类以转移的优化为难点. DP的类型 序列DP [例题]BZOJ2298 problem a 数位DP 常用来统计或者查找一个区间满足条件的 ...

  10. KeyChainWrapper - keychain简单使用

    1 keyChainWrapper是MRC代码,要禁用ARC -fno-objc-arc 2 要导入Security.framework框架 3 获得一个不变的UUID - (BOOL)applica ...