- 1.我们知道我们是通过coyoteAdapter来让request开始整个cotainer容器之旅的
- 2.其中的响应结果封装再response中,注意这边的请求和响应都是HttpServletRequest和HttpServletResponse
- 3.当我们得到response之后通过finishResponse这方法来响应客户端
- 4.而对于异步处理 则会返回 SocketState.LONG; 其会在我们的poller里面的selector上注册一个read事件
- 5.将当前处理这个异步请求的processor缓存在waitingProcessors中
- 6.当处理完成之后selector会捕捉到事件最终还是调用response的finishResponse去响应
而具体的响应逻辑则:
调用StandardHostValve的status方法
其内部会根据response的响应码做一些操作
最终调用了 org.apache.catalina.connector.Response(javax.servlet.http.HttpServletResponse的子类)的finishResponse方法
其会调用 OutputBuffer (java.io.Writer的子类)的close方法
该方法会关闭outputbuffer,同时将buffer中剩余的数据flush出去,同时调用
org.apache.coyote.Response的action方法
根据该方法的参数不同执行不同的逻辑
比如有COMMIT,CLOSE,ACK,CLIENT_FLUSH,AVAILABLE,REQ_SET_BODY_REPLAY,IS_ERROR,
CLOSE_NOW,DISABLE_SWALLOW_INPUT等
我们的响应就是CLOSE,最终调用的是Http11OutputBuffer的finishResponse
其底层使用了我们的selectorPool来协助
网友评论