异步servlet

来源:互联网 发布:使命召唤账号数据异常 编辑:程序博客网 时间:2024/05/18 02:41
servlet从3.0开始支持异步

使用异步servlet好处在于:

一个请求,服务器启动一个servlet线程处理,直到处理完毕,服务器回收此servlet线程,要知道,servlet线程是有限的,也就是说,这个请求会一直占用着该servlet线程。遇到高并发的时候,那么服务器的处理就会遇到瓶颈;如果异步servlet进行处理的话,一个请求过来,服务器启动一个servlet线程处理,在servlet线程启动一个工作线程,然后servlet线程马上返回,继续处理其它请求。而工作线程处理完毕后,会返回给请求。

优点在于:当处理高并发,大数据量操作时候,异步处理,可以让服务器快速的接收请求,相对于同步而言,降低servlet线程阻塞的可能。


使用xml配置

1. 需要添加3.0配置如下:
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">

2. 对servlet添加异步支持:
<servlet>        <description>**</description>        <display-name>**</display-name>        <servlet-name>**</servlet-name>        <servlet-class>**/servlet-class>        <async-supported>true</async-supported></servlet>

代码例子:

 @Override    protected void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws IOException {    String asyn = req.getParameter("asyn");        if(StringUtils.isBlank(asyn)){            System.out.println("开始同步处理------");            log.error("开始同步处理------");            doSynWork(req,resp);        }else{            System.out.println("开始异步处理======");            log.error("开始异步处理======");            context = req.startAsync();            executorService.execute(new Runnable(){                @Override                public void run() {                    try {                        doSynWork(req,resp);                    } catch (Exception e) {                        e.printStackTrace();                    }finally {                        context.complete();                    }                }            });        }    }



经过以上步骤,就可以实现servlet,当然也支持注解形式,这了就不再举例。

参考:http://www.infoq.com/cn/news/2013/11/use-asynchronous-servlet-improve



0 0
原创粉丝点击