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

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

初始化构造方法

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

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

  1. @Override
  2. public Http11NioProcessor createProcessor() {
  3. Http11NioProcessor processor = new Http11NioProcessor(
  4. proto.getMaxHttpHeaderSize(), proto.getRejectIllegalHeaderName(),
  5. (NioEndpoint)proto.endpoint, proto.getMaxTrailerSize(),
  6. proto.getAllowedTrailerHeadersAsSet(), proto.getMaxExtensionSize(),
  7. proto.getMaxSwallowSize());
  8. proto.configureProcessor(processor);
  9. register(processor);
  10. return processor;
  11. }

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

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

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

  1. Http11NioProcessor
  1. public Http11NioProcessor(int maxHttpHeaderSize, boolean rejectIllegalHeaderName,
  2. NioEndpoint endpoint, int maxTrailerSize, Set<String> allowedTrailerHeaders,
  3. int maxExtensionSize, int maxSwallowSize) {
  4.  
  5. super(endpoint);
  6.  
  7. inputBuffer = new InternalNioInputBuffer(request, maxHttpHeaderSize,
  8. rejectIllegalHeaderName);
  9. request.setInputBuffer(inputBuffer);
  10.  
  11. outputBuffer = new InternalNioOutputBuffer(response, maxHttpHeaderSize);
  12. response.setOutputBuffer(outputBuffer);
  13.  
  14. initializeFilters(maxTrailerSize, allowedTrailerHeaders, maxExtensionSize, maxSwallowSize);
  15. }

super(endpoint)

  1. public AbstractHttp11Processor(AbstractEndpoint<S> endpoint) {
  2. super(endpoint);
  3. userDataHelper = new UserDataHelper(getLog());
  4. }

继续super(endpoint)

  1. public AbstractProcessor(AbstractEndpoint<S> endpoint) {
  2. this.endpoint = endpoint;
  3. asyncStateMachine = new AsyncStateMachine(this);
  4. request = new Request();
  5. response = new Response();
  6. response.setHook(this);
  7. request.setResponse(response);
  8. request.setHook(this);
  9. }

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

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

注意:

  1. request.setInputBuffer(inputBuffer);

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

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

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



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



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



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


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

从解析阶段

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

请求处理阶段。(重点)

  1. 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. (线段树 点更新 区间求和)lightoj1112

    链接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88230#problem/D (密码0817) Description Robin ...

  2. android java层实现hook替换method

    Android上的热修复框架 AndFix 大家都很熟悉了,它的原理实际上很简单: 方法替换——Java层的每一个方法在虚拟机实现里面都对应着一个ArtMethod的结构体,只要把原方法的结构体内容替 ...

  3. hdu 1877

    题目 一个进制转换的题,注意0+0的情况 代码如下: #include <cstdio> int d[1000]; void solve(int n,int base) { int p = ...

  4. Ansible组件之inventory主机清单

    静态inventory 所有的主机信息都存放在Ansible的inventory组件里面,默认Ansible的inventory是一个静态的ini格式的文件/etc/ansible/hosts,当然还 ...

  5. 转: JaxbContext生成xml文件或java类对象转化注解

    JAXB(Java API for XML Binding),提供了一个快速便捷的方式将Java对象与XML进行转换.在JAX-WS(Java的WebService规范之一)中,JDK1.6 自带的版 ...

  6. TSQL--按某字段列分组,在将各组中某列合并成一行

    鉴于群里很多同事在问这个问题,我简单写个Demo,希望对初学者有帮助! 无真相,无解说,不解释,直接上Code! --========================================= ...

  7. vim基本命令速查表

    来源:https://github.com/skywind3000/awesome-cheatsheets/blob/master/editors/vim.txt ################## ...

  8. 关于gridview改变行内容事件需要点击别的行或控件才能执行

    一般的datagridview控件: this.dgvAssetList.CurrentCell = null;//取消datagridview行的编辑状态 Dev gridcontrol控件  Gr ...

  9. DevExpress WinForms Controls 学习系列1

    一个偶然的机会,接触到DevExpress.项目是WinForm的,应用了DevExpress.为了使项目具备维护开发的生命力,我觉得有必要系统的学习一下DevExpress,今天是学习笔记的第一篇. ...

  10. 手写数字识别---demo

    数据准备 课程中获取数据的方法是从库中直接load_data from keras.datasets import mnist (x_train, y_train), (x_test, y_test) ...