Tomcat servlet3的异步化原理理解

Servlet3.0 异步处理

Servlet3.1 非阻塞IO

转:https://blog.csdn.net/zhurhyme/article/details/76228836

https://www.cnblogs.com/davenkin/p/async-servlet.html

tomcat如何处理请求
从客户端发出一次请求至tomcat容器大致经过如下过程:

  1. 客户端发出http请求至tomcat的连接监听端口;
  2. tomcat connector接收线程接收请求,并根据http协议解析该次请求;
  3. tomcat 通过解析的http报文,初始化org.apache.coyote.Request,并实例化org.apache.coyote.Response;
  4. 经装饰模式转化为servlet api对应的HttpServletRequest与HttpServletReponse;
  5. 经tomcat的层层容器engine,host,context最终到过我们所写的业务servlet的service方法;
  6. 业务方法service,处理相关的业务逻辑,写入相应的响应的至response,并返回tomat的容器组件;
  7. tomcat该处理线程关闭响应流Response并将响应内容返回客户端;
  8. tomcat该处理线程被释放,然后用于下次请求的处理;

所以tomat结合servlet3异步化的整体请求处理过程大致如下:

  1. 客户端发出http请求至tomcat的连接监听端口;
  2. tomcat connector接收线程接收请求,并根据http协议解析该次请求;
  3. tomcat 通过解析的http报文,实例化org.apache.coyote.Request,并实例化org.apache.coyote.Response;
  4. 经装饰模式转化为servlet api对应的HttpServletRequest与HttpServletReponse;
  5. 经tomcat的层层容器engine,host,context最终到过我们所写的业务servlet的service方法;
  6. 业务方法开启异步化上下文AsynContext;释放tomcat当前处理线程;
  7. tomcat判断当前请求是否开启了异步化,如果开启则不关闭响应流Response,也不进行用户响应的返回;
  8. tomcat该线程被释放,然后用于下次请求的处理,提高其吞吐量;
  9. 业务方法在AsynContext环境中完成业务方法的处理,调用其complete方法,将响应写回响应流,并关闭响应流,完成此次请求处理.

package davenkin.servlet;

import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(value = "/simpleAsync", asyncSupported = true)
public class SimpleAsyncHelloServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        AsyncContext asyncContext = request.startAsync();

        asyncContext.start(() -> {
            new LongRunningProcess().run();
            try {
                asyncContext.getResponse().getWriter().write("Hello World!");
            } catch (IOException e) {
                e.printStackTrace();
            }
            asyncContext.complete();
        });

    }

}

你可能感兴趣的:(Java服务器端技术,Java,Web)