现在的位置: 首页 > 综合 > 正文

谈谈jetty response模型

2013年12月02日 ⁄ 综合 ⁄ 共 1147字 ⁄ 字号 评论关闭

1)jetty 响应的概念模型

  • SelectChannelEndPoint: 底层的socket的封装,代表每次请求对应的网络连接(偏网路底层)
  • AsyncHttpConnection:代表每次连接(偏上层一点),管理相关的request,response,HttpParser,HttpGenerator实例
  • HttpParser:请求解析
  • HttpGenerator:负责最终的response生成
  • Response:不解释
  • Request:不解释
  • JettyServer: servlet容器,负责处理servlet相关逻辑

2)请求的实例化

  • ​select线程感知到网络请求于是开始初始化途中的各个相关类的实例
  • 最后将请求封装成一个endpoint实例丢入worker线程的队列中的等待处理

3)jetty 整体的响应流程

  •  worker线程从请求队列获取请求 
  • 请求(底层是个SelectChannelEndPoint)开始处理 
  • SelectChannelEndPoint调用相关的AsyncHttpConnection进行处理
  • AsyncHttpConnection调用HttpParser解析请求
  • AsyncHttpConnection调用servlet容器处理请求(真正的业务处理)
  • servlet处理完毕处理,AsyncHttpConnection开始调用Response处理响应

4)在servlet中调用write/flush的底层实现

样例代码:

PrintWriter out = response.getWriter();
out.write(request.getParameter("id"));
out.flush();


  • servlet中调用write底层会调用HttpGenerator的addContent方法
  • addContent会将内容填充到HttpGenerator的_content,_content内容会被拷贝到内部buffer,如果超过内部buffer的长度就会自动flush
  • servlet中调用write底层会调用HttpGenerator的flushBuffer,此操作会触发真正的网络流,下一节会具体谈

5)Response.complete到底干了什么

  • 调用AsyncHttpConnection的completeResponse
    • 调用HttpGenerator生成header内容
    • 调用HttpGenerator生成content内容
  • 一旦reponse header和response content完成,开始flush
  • 会将header buffer和content buffer传入SelectChannelEndPoint的gatheringFlush做矢量IO
  • 最终还是调用底层socket完成网络响应

抱歉!评论已关闭.