码迷,mamicode.com
首页 > 其他好文 > 详细

厉害了,Servlet3的异步处理机制

时间:2020-04-29 16:33:33      阅读:50      评论:0      收藏:0      [点我收藏+]

标签:git   ddl   推荐   class   list   sys   开始   Servle   extend   

Servlet3发布好几年了,又有多少人知道它的新特性呢?下面简单介绍下。

主要增加了以下特性:

1、异步处理支持

2、可插性支持

3、注解支持,零配置,可不用配置web.xml

...

异步处理是什么鬼?

直接操起键盘干。

@WebServlet(name = "index", urlPatterns = { "/" }, asyncSupported = true)

public class?IndexServlet?extends HttpServlet {

? ? @Override

? ? protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

? ? ? ? resp.setContentType("text/html");

? ? ? ? try {

? ? ? ? ? ? PrintWriter out = resp.getWriter();

? ? ? ? ? ? out.println("servlet started.<br/>");

? ? ? ? ? ? out.flush();

? ? ? ? ? ??AsyncContext asyncContext = req.startAsync();

? ? ? ? ? ? asyncContext.addListener(getListener());

? ? ? ? ? ? asyncContext.start(new IndexThread(asyncContext));

? ? ? ? ? ? out.println("servlet end.<br/>");

? ? ? ? ? ? out.flush();

? ? ? ? } catch (Exception e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? }

? ? }

? ? /**

? ? ?* 异步线程结果监听

? ? ?* @author javastack

? ? ?* @return

? ? ?*/

? ? private AsyncListener getListener() {

? ? ? ? return new AsyncListener() {

? ? ? ? ? ? public void?onComplete(AsyncEvent asyncEvent) throws IOException {

? ? ? ? ? ? ? ? asyncEvent.getSuppliedResponse().getWriter().close();

? ? ? ? ? ? ? ? System.out.println("thread completed.");

? ? ? ? ? ? }

? ? ? ? ? ? public void?onError(AsyncEvent asyncEvent) throws IOException {

? ? ? ? ? ? ? ? System.out.println("thread error.");

? ? ? ? ? ? }

? ? ? ? ? ? public void?onStartAsync(AsyncEvent asyncEvent) throws IOException {

? ? ? ? ? ? ? ? System.out.println("thread started.");

? ? ? ? ? ? }

? ? ? ? ? ? public void?onTimeout(AsyncEvent asyncEvent) throws IOException {

? ? ? ? ? ? ? ? System.out.println("thread timeout.");

? ? ? ? ? ? }

? ? ? ? };

? ? }

}

public class?IndexThread?implements Runnable {

? ? private AsyncContext asyncContext;

? ? public IndexThread(AsyncContext asyncContext) {

? ? ? ? this.asyncContext = asyncContext;

? ? }

? ? public void run() {

? ? ? ? try {

? ? ? ? ? ? Thread.sleep(5000);

? ? ? ? ? ? PrintWriter out = asyncContext.getResponse().getWriter();

? ? ? ? ? ? out.println("hello servlet3.<br/>");

? ? ? ? ? ? out.flush();

? ? ? ? ? ? asyncContext.complete();

? ? ? ? } catch (Exception e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? }

? ? }

}

访问localhost:8080/test

页面首先输出

servlet started.
servlet end.

过了5秒后再输出

hello servlet3.

可以看出servlet立马返回了,但没有关闭响应流,只是把response响应传给了线程,线程再继续输出,我们可以将比较费资源消耗时间的程序放到异步去做,这样很大程序上节省了servlet资源。

Springmvc3.2开始也加入了servlet3异步处理这个特性,有兴趣的同学可以去研究下。

从上面的servlet注解也可以看出来,servlet3完全解放了web.xml配置,通过注解可以完全代替web.xml配置。

推荐去我的博客阅读更多:

1.Java JVM、集合、多线程、新特性系列教程

2.Spring MVC、Spring Boot、Spring Cloud 系列教程

3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

4.Java、后端、架构、阿里巴巴等大厂最新面试题

觉得不错,别忘了点赞+转发哦!

厉害了,Servlet3的异步处理机制

标签:git   ddl   推荐   class   list   sys   开始   Servle   extend   

原文地址:https://www.cnblogs.com/javastack/p/12802902.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!