tomcat启动(Ⅶ)请求处理--Processor.process(SocketWrapper<S> socketWrapper)
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)的更多相关文章
- 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 ...
- spring tomcat启动 请求处理
onRefresh(); protected void onRefresh() { try { createEmbeddedServletContainer(); } } private void c ...
- 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 ...
- Tomcat启动和请求处理解析
tomcat是我们经常使用的组件,但是内部是如何运行的呢,我们去一探究竟. 1.tomcat架构 tomcat的整体架构图如下: Tomcat中只有一个Server,一个Server可以有多个Serv ...
- tomcat启动(六)Catalina分析-StandardServer.start()
从链接 Tomcat中组件的生命周期管理公共接口Lifecycle 可以知道调用的是StandardServer.startInternal() @Override protected void st ...
- Tomcat启动流程简析
Tomcat是一款我们平时开发过程中最常用到的Servlet容器.本系列博客会记录Tomcat的整体架构.主要组件.IO线程模型.请求在Tomcat内部的流转过程以及一些Tomcat调优的相关知识. ...
- How Tomcat works — 五、tomcat启动(4)
前面摆了三节的姿势,现在终于要看到最终tomcat监听端口,接收请求了. 目录 Connector Http11Protocol JIoEndpoint 总结 在前面的初始化都完成之后,进行Conne ...
- 如何在tomcat启动的时候运行一个Java类
设置个Listener就好了,在web.xml中指定描述. web.xml其实就是tomcat启动的时候会读取的一个描述文件,比如访问服务器的时候首页等都可以在里面指定,有相应的tag.这里有解释:h ...
- 远程控制TOMCAT启动
远程控制TOMCAT启动 1.在tomcat/conf/tomcat-users.xml中配置好管理员帐号和密码. 2.在浏览器中输入:http://你的ip/manager/list. ...
随机推荐
- (线段树 点更新 区间求和)lightoj1112
链接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88230#problem/D (密码0817) Description Robin ...
- android java层实现hook替换method
Android上的热修复框架 AndFix 大家都很熟悉了,它的原理实际上很简单: 方法替换——Java层的每一个方法在虚拟机实现里面都对应着一个ArtMethod的结构体,只要把原方法的结构体内容替 ...
- hdu 1877
题目 一个进制转换的题,注意0+0的情况 代码如下: #include <cstdio> int d[1000]; void solve(int n,int base) { int p = ...
- Ansible组件之inventory主机清单
静态inventory 所有的主机信息都存放在Ansible的inventory组件里面,默认Ansible的inventory是一个静态的ini格式的文件/etc/ansible/hosts,当然还 ...
- 转: JaxbContext生成xml文件或java类对象转化注解
JAXB(Java API for XML Binding),提供了一个快速便捷的方式将Java对象与XML进行转换.在JAX-WS(Java的WebService规范之一)中,JDK1.6 自带的版 ...
- TSQL--按某字段列分组,在将各组中某列合并成一行
鉴于群里很多同事在问这个问题,我简单写个Demo,希望对初学者有帮助! 无真相,无解说,不解释,直接上Code! --========================================= ...
- vim基本命令速查表
来源:https://github.com/skywind3000/awesome-cheatsheets/blob/master/editors/vim.txt ################## ...
- 关于gridview改变行内容事件需要点击别的行或控件才能执行
一般的datagridview控件: this.dgvAssetList.CurrentCell = null;//取消datagridview行的编辑状态 Dev gridcontrol控件 Gr ...
- DevExpress WinForms Controls 学习系列1
一个偶然的机会,接触到DevExpress.项目是WinForm的,应用了DevExpress.为了使项目具备维护开发的生命力,我觉得有必要系统的学习一下DevExpress,今天是学习笔记的第一篇. ...
- 手写数字识别---demo
数据准备 课程中获取数据的方法是从库中直接load_data from keras.datasets import mnist (x_train, y_train), (x_test, y_test) ...