加入收藏 | 设为首页 | 会员中心 | 我要投稿 济宁站长网 (https://www.0537zz.cn/)- 行业智能、边缘计算、专有云、AI硬件、5G!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

查漏补缺:连接器在Tomcat中是如何设计的

发布时间:2019-09-25 06:54:49 所属栏目:外闻 来源:今日头条
导读:从连接器(Connector)源码说起 既然是来解析连接器(Connector),那么我们直接从源码入手,后面所有源码我会剔除不重要部分,所以会忽略大部分源码细节,只关注流程。源码如下(高能预警,大量代码): publicclassConnectorextendsLifecycleMBeanBase{ public

Poller调用的run方法或者用Executor线程池去执行run(),最终调用都是各个子EndPoint中的doRun()方法,最终会取一个Handler去处理socketWrapper。继续看源码:

  1. //类:13.AbstractProtocol内部类ConnectionHandler implements AbstractEndpoint.Handler<S> 
  2.  public SocketState process(SocketWrapperBase<S> wrapper, SocketEvent status) { 
  3.  //省略部分代码 
  4.   
  5.  state = processor.process(wrapper, status); 
  6.   
  7.  return SocketState.CLOSED; 
  8.  } 
  9.   
  10. //类:14.AbstractProcessorLight implements Processor  
  11. public SocketState process(SocketWrapperBase<?> socketWrapper, SocketEvent status) 
  12.  throws IOException { 
  13.  //省略部分代码 
  14.   
  15.  state = service(socketWrapper); 
  16.   
  17.  return state; 
  18.  } 

这部分源码表明最终调用的process是通过一个Processor接口的实现类来完成的,这里最终也是会调用到各个子类中,那么这里的处理器其实就是处理应用协议,我们可以查看AbstractProcessorLight的实现类,分别有AjpProcessor、Http11Processor、StreamProcessor,分别代表tomcat支持三种应用层协议,分别是:

  • AJP协议
  • HTTP.1协议
  • HTTP2.0协议

这里我们以常用的HTTP1.1为例,继续看源码:

  1. //类:15. Http11Processor extends AbstractProcessor 
  2. public SocketState service(SocketWrapperBase<?> socketWrapper) 
  3.  throws IOException { 
  4.  //省略大部分代码 
  5.  getAdapter().service(request, response); 
  6.  //省略大部分代码  
  7.  }  
  8. //类:16 CoyoteAdapter implements Adapter 
  9. public void service(org.apache.coyote.Request req, org.apache.coyote.Response res) 
  10.  throws Exception { 
  11.  Request request = (Request) req.getNote(ADAPTER_NOTES); 
  12.  Response response = (Response) res.getNote(ADAPTER_NOTES); 
  13.  postParseSuccess = postParseRequest(req, request, res, response); 
  14.  if (postParseSuccess) { 
  15.  //check valves if we support async 
  16.  request.setAsyncSupported( 
  17.  connector.getService().getContainer().getPipeline().isAsyncSupported()); 
  18.  // Calling the container 
  19.  connector.getService().getContainer().getPipeline().getFirst().invoke( 
  20.  request, response); 
  21.  } 
  22.   
  23.  } 

(编辑:济宁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读