Other - 02 - Servlet学习笔记 - 异步Servlet

异步Servlet

Servlet默认情况下都是同步的,但是Servlet可以进行异步的调用。

  1. /**
  2. * Servlet implementation class MainServlet
  3. */
  4. @WebServlet(value = "/MainServlet", asyncSupported = true)
  5. public class AsynServlet extends HttpServlet {
  6. private static final long serialVersionUID = 1L;
  7. /**
  8. * Default constructor.
  9. */
  10. public AsynServlet() {
  11. }
  12. /**
  13. * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
  14. */
  15. @Override
  16. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  17. throws ServletException, IOException {
  18. long startTime = System.currentTimeMillis();
  19. System.out.println("DoGet Start ThreadName = " + Thread.currentThread().getName() + " ThreadId = "
  20. + Thread.currentThread().getId());
  21. AsyncContext asyncCtx = request.startAsync();
  22. asyncCtx.setTimeout(9000);
  23. ExecutorService executorService = (ExecutorService) request.getServletContext().getAttribute("executorService");
  24. executorService.execute(() -> {
  25. try {
  26. System.out.println();
  27. Thread.sleep(5000);
  28. asyncCtx.complete();
  29. } catch (Exception e) {
  30. e.printStackTrace();
  31. }
  32. });
  33. long endTime = System.currentTimeMillis();
  34. System.out.println("doGet End ThreadName = " + Thread.currentThread().getName() + " ThreadId = "
  35. + Thread.currentThread().getId() + " Time = " + (endTime - startTime) + " ms.");
  36. request.getRequestDispatcher("/AnotherServlet").forward(request, response);
  37. }
  38. /**
  39. * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  40. */
  41. @Override
  42. protected void doPost(HttpServletRequest request, HttpServletResponse response)
  43. throws ServletException, IOException {
  44. doGet(request, response);
  45. }
  46. }

异步调用代表当前线程(Tomcat容器线程)到达异步调用处 request.startAsync() 时,会释放掉自己,然后委托另一个业务线程(这里是新建的线程池里的一个业务线程)来完成业务处理,然后调用异步请求的 complete 方法完成异步任务,而 Tomcat 容器线程在异步任务正在执行的过程中会保存起当前任务的状态,一边执行其他的请求,一边等待 complete 的调用,一旦 complete 调用,则异步的请求完成,由原来的 Tomcat 线程完成清理工作,并返回客户端。

这种模式下,Tomcat 容器线程可以在耗时操作的情况下得到快速的释放并处理新请求,缓解容器线程被占满的情况。

对于 Long Pool 模型,可以有两种请求模式:

一种是客户端不断的轮询,根据每一次请求返回的状态进行判断渲染页面,这种方式需要选定合适的轮询周期,否则会导致服务器端计算压力巨大。

另一种是使用长连接,由服务器 hold 住连接,等待一个事件发生之后让长连接返回客户端,客户端渲染页面,之后客户端在次发起一个长连接,这种方式需要消耗掉服务器大量的资源,需要设置合适的在次连接延迟和连接超时时间。

来自为知笔记(Wiz)

时间: 2024-12-05 11:37:47

Other - 02 - Servlet学习笔记 - 异步Servlet的相关文章

《Servlet学习笔记》Servlet生命周期和调用

    学习技术有时会感觉很枯燥,有时感觉很绕,N多调用,不好理解,但如果能画出图来,就可以一目了然. 图比文字更容易让人接受,并产生深刻印象.一张图可以包含很多东西. 下面一些图来自于网络,偶然间发现,感觉让人忽然明白并回忆起了好多. Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后: Web服务器首先检查是否已经装载并创建了该Servlet的实例对象.如果是,则直接执行第四步,否则,执行第二步: 装载并创建该Servlet的一个实例对象: 调用Serv

《Servlet学习笔记》Servlet 简介

Servlet 简介:Servlet是sun公司提供的一门用于开发动态web资源的技术.Sun公司在其API中提供了一个servlet接口,用户若想开发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下两步:1.编写一个Java类,实现servlet接口:2.把开发好的Java类部署到web服务器中. jsp就是servletjavase.javaee,servlet不属于javase而属于javaeeservlet专门文档APITomcat可以运行servlet,lib

(Servlet学习笔记)Servlet的小范例

Web.xml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <display-nam

《Servlet学习笔记》Servlet开发细节

Servlet开发细节1.由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成.2.<servlet>元素用于注册Servlet,它包含有两个主要的子元素:<servlet-name>和<servlet-class>,分别用于设置Servlet的注册名称和Serv

《Servlet学习笔记》Servlet接口实现类

Servlet接口SUN公司定义了两个默认实现类,分别为:GenericServlet.HttpServlet. HttpServlet指能够处理HTTP请求的Servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大.因此开发人员在开发Servlet的时候,通常应该继承这个类,而避免直接去实现Servlet接口. HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GE

《Servlet学习笔记》Servlet开发细节-线程安全

Servlet开发细节-线程安全当多个客户端并发访问同一个Servlet时,web服务器会为每一个客户端的访问请求创建一个线程,并在这个线程上调用Servlet的service方法,因此service方法内如果访问了通过一个资源的话,就有可能引发线程安全问题.使用同步块可以解决线程安全问题,但是会使并发串行化.如果某个Servlet实现了SingleThreadModel接口,那么Servlet引擎将以单线程模式来调用其service方法.SingThreadModel接口中没有定义任何方法,只

测试servlet学习笔记

操作方法: 1.新建工程: File-->new-->Java Project-->TestServlet(工程名称)-->Finish. 2.加载servlet-api.jar类包: TestServlet(右键)-->Build Path-->Configure Build Path-->Library -->Add External JAR Selection-->(浏览在tomcat的lib目录下找到servlet-api.jar选中后点击打开

SERVLET 学习笔记

SERVLET 学习笔记 一.Servlet基本定义 Servlet是服务器端上面运行的一段小的java程序,一个servlet就是一个简答的java类.通常servlet都是通过请求和返回的模式来被访问的,客户端通过resuest请求,servlet则通过response来返回需要的内容. 二.Tomcat容器等级 Tomcat容器等级分为四个等级,由内向外分别是:context容器àSERVLET容器àHOST(主机)容器àENGINE(引擎)容器.其中,CONTEXT容器,一个CONTEX

Servlet学习笔记(八)—— 自定义过滤器的编写改进:自定义实现FilterChain

笔记六中实现了三种过滤器:字符编码过滤.登录权限过滤.敏感词过滤,但是有个缺陷就是,限定了过滤顺序,而不能实现先进行request过滤,最后response过滤,并且中间几项过滤的顺序不能动态改变.所以这里做个改进,实现一个过滤顺序的FilterChain. 多个Filter的执行顺序在这篇博文中得到很仔细的讲解,总结一点,多个过滤器的执行顺序是根据web.xml中不同<filter-mapping>的顺序来先后执行的,比如: <?xml version="1.0"