你的位置:首页 > 软件开发 > Java > How Tomcat works — 六、tomcat处理请求

How Tomcat works — 六、tomcat处理请求

发布时间:2016-08-10 09:00:16
tomcat已经启动完成了,那么是怎么处理请求的呢?怎么到了我们所写的servlet的呢?目录Http11ConnectionHandlerHttp11ProcessorCoyoteAdapterStandardEngineValveStandardWrapperValve总结 ...

How Tomcat works — 六、tomcat处理请求

tomcat已经启动完成了,那么是怎么处理请求的呢?怎么到了我们所写的servlet的呢?

目录

  • Http11ConnectionHandler
  • Http11Processor
  • CoyoteAdapter
  • StandardEngineValve
  • StandardWrapperValve
  • 总结

Http11ConnectionHandler

在tomcat 启动之后会使用socket.accept接收请求,接收到之后会调用自己的processSocket来处理请求,在该方法中启动一个SocketProcessor线程,在该内部类的润方法内调用Http11ConnectionHandler.process,过程如下:

How Tomcat works — 六、tomcat处理请求

实际执行的是超类AbstractConnectionHandler.process方法,主要作用:

  • 从connections里面获取processor
  • 如果processor为null则尝试从队列里面获取一个processor,该队列是一个RecycledProcessors类继承自ConcurrentLinkedQueue,是一个线程安全的队列,因为同时会有多个线程获取processor
  • 如果processor还是为null(表明还未创建或者已经用完),那么创建一个新的processor,调用Http11ConnectionHandler.createProcessor,该方**创建一个新的Http11Processor(但是并不会立即添加到上面提到的队列里面,而是在请求处理完成之后才会添加到队列里面)
  • 调用Http11Processor.process

Http11Processor

在connector出来完成之后会启动processor线程,关于processor的类图如下:

How Tomcat works — 六、tomcat处理请求

和处理协议一 一对应,不同的协议也有不同的processor,在AbstractProcessor里面有Request和Response,不过是org.apache.coyote包下面的,这是在connector层面的连接器,是primitive的。

实际执行的也是超类AbstractHttp11Processor.process,主要功能如下:

  • 获得socket的输入、输出流
  • parsing request header、method、requestURI
  • 设置request filters,并设置content-length等header
  • 调用CoyoteAdapter.service

CoyoteAdapter

由connector和processor过渡到container的类,使用了adapter模式,将container适配到processor。主要的方法就是CoyoteAdapter.service:

  • 获取org.apache.connector.Request和Response,这两个类经过facade模式之后就是最后我们servlet中使用的request和response
  • 如果是新建的processor,request和response为null,那么就调用connector.createRequest和createResponse新建,然后设置到coyote.request的note中
  • 调用postParseRequest,添加wrapper和servlet之间的映射(在后面load servlet的时候用到),parseSessionId解析sessionId
  • connector.getService().getContainer().getPipeline().getFirst().invoke(request, response),依次是:Connector,StandardService,StandardEngine,StandardPipeline,StandardEngineValve
  • 在执行完之后,完成请求也在这个方法中:request.finishRequest(上面说过的processor就是在这儿回收的),response.finishResponse(请求在这里返回到客户端,outputStream)
  • 最后,recycle request和response,清空request和response所有信息

StandardEngineValve

这个是StandardEngine的基础阀(每个容器都有一个pipeline,每个pipeline都有一个基础阀,用来调用servlet)在adapter中最后调用到了StandardEngineValve.invoke方法,该方法主要进行了以下操作

  • request.getHost:获取host
  • host.getPipeline().getFirst().invoke(request, response):依次是StandardHost,StandardPipeline,StandardHostValve

接下来就是容器逐级依次调用,下一个是StandardHostValve:

context.getPipeline().getFirst().invoke(request, response);

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:How Tomcat works — 六、tomcat处理请求

关键词:tomcat

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录