想去配置servlet3.0支持异步

版权声明:本文为博主原创文章,未经博主允许不得转载。你想转载请附加连接哦 https://blog.csdn.net/dmw412724/article/details/83038193

异步有什么好处?


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

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

servlet3异步化

客户端发出http请求至tomcat的连接监听端口;
tomcat connector接收线程接收请求,并根据http协议解析该次请求;
tomcat 通过解析的http报文,实例化org.apache.coyote.Request,并实例化org.apache.coyote.Response;
经装饰模式转化为servlet api对应的HttpServletRequest与HttpServletReponse;
经tomcat的层层容器engine,host,context最终到过我们所写的业务servlet的service方法;
业务方法开启异步化上下文AsynContext;释放tomcat当前处理线程;
tomcat判断当前请求是否开启了异步化,如果开启则不关闭响应流Response,也不进行用户响应的返回;
tomcat该线程被释放,然后用于下次请求的处理,提高其吞吐量;
业务方法在AsynContext环境中完成业务方法的处理,调用其complete方法,将响应写回响应流,并关闭响应流,完成此次请求处理.
所以用一句话总结servlet3的基本原理就是:网络连接依旧在,提前释放tomcat处理线程用于提高吞吐量,响应流不关闭,由业务方法自己处理。从这个角度来看基于servlet3的异步化完全有可能实现真正的服务端push。但异步化对响应时间并没有多大影响,甚至不一定比同步响应时间短。它只是提高了吞吐量。让线程物尽其用。
 

怎么配置呢?

如果什么都不配置,在使用异步都时候会报错:!AsyncSupport

那么怎么配置呢?

基本上所有链都需要配置了。

在xml里,

对于servlet要这样配置了。

<servlet>
    <servlet-name>AsyncServlet</servlet-name>
    <servlet-class>cc.openhome.AsyncServlet</servlet-class>
    <async-supported>true</async-supported>
</servlet>

那么filter依然要配置这个

<async-supported>true</async-supported>

甚至如果你用springmvc.xml,那么<mvc:annotions/>这个表情里面也要添加上面那个异步支持。

如果你要是使用注解,不管是@WebServlet还是@WebFiter,都需要加上:,asyncSupported = true,就像下面这个一样。

@WebServlet(value = "aaa",asyncSupported = true)

猜你喜欢

转载自blog.csdn.net/dmw412724/article/details/83038193