`
wangheid
  • 浏览: 37188 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Servlet 3.0笔记之异步请求相关方法和AsyncContext转发

 
阅读更多
在ServletRequest中增加的有关异步相关方法分为:
  1. startAsync(servletRequest, servletResponse) 传入指定的request和response对象,便于在AsyncContext中重复使用(这样被Filter、Servlet包装过的请求、相应对象才会在异步的环境下继续生效)。
  2. startAsync() 若request或者response被包装,将失去预期的效果。
  3. isAsyncSupported()isAsyncStarted()
    辅助性的方法,用于判断当前请求是否支持异步或者异步已经开始。
  4. getAsyncContext()
    需要在异步启动之后才能够访问,否则会报异常。
在AsyncContext中分发的方法有三个,不太容易区分:
  1. AsyncContext.dispatch()
    若当前AsyncContext由ServletRequest.startAsync(ServletRequest, ServletResponse)方法启动,返回的地址可以通过HttpServletRequest.getRequestURI()得到。
    否则,分发的地址则是当前URL request对象最后一次分发的地址。
    虽有些拗口,两者分发的地址大部分情况下一致;但尽量使用带有参数的异步上下文启动器。
    如本例中请求/asyncDispatch2Async?disUrl=self,执行dispatch()方法之后,自身会再次分发到自身,包括传递的参数。
  2. AsyncContext.dispatch(String path)
    等同于ServletRequest.getRequestDispatcher(String)算是一个快捷方法。
    可以转向一个同步或异步的servlet,或者JSP,或其它资源地址等。
  3. AsyncContext.dispatch(ServletContext context, String path)
    请求的地址将在给定的上下文里面(ServletContext),有有可能传入的上下文与当前站带你应用的上下文有所区别。
展示一个较为有趣、但没有多少实际意义的小示范:
/**
 * 异步上下文的转向分发
 * 
 * @author yongboy
 * @date 2011-1-14
 * @version 1.0
 */
@WebServlet(urlPatterns = { "/asyncDispatch2Async" }, asyncSupported = true)
public class AsyncContextDispatch2AsyncServlet extends HttpServlet {
 private static final long serialVersionUID = 46172233331022236L;
 private static final Log log = LogFactory
   .getLog(AsyncContextDispatch2AsyncServlet.class);

 protected void doGet(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  response.setHeader("Cache-Control", "private");
  response.setHeader("Pragma", "no-cache");
  response.setHeader("Connection", "Keep-Alive");
  response.setHeader("Proxy-Connection", "Keep-Alive");
  response.setContentType("text/html;charset=UTF-8");

  PrintWriter out = response.getWriter();
  out.println("
Start ...
"); out.flush(); if (!request.isAsyncSupported()) { log.info("the servlet is not supported Async"); return; } request.startAsync(request, response); if (request.isAsyncStarted()) { AsyncContext asyncContext = request.getAsyncContext(); asyncContext.setTimeout(1L * 60L * 1000L);// 60sec new CounterThread(asyncContext).start(); } else { log.error("the ruquest is not AsyncStarted !"); } } private static class CounterThread extends Thread { private AsyncContext asyncContext; public CounterThread(AsyncContext asyncContext) { this.asyncContext = asyncContext; } @Override public void run() { int interval = 1000 * 20; // 20sec try { log.info("now sleep 20s, just as do some big task ..."); Thread.sleep(interval); log.info("now dispatch to another Async Servlet"); ServletRequest request = asyncContext.getRequest(); String disUrl = request.getParameter("disUrl"); if (StringUtils.isBlank(disUrl)) { disUrl = "/demoAsyncLink"; } if (disUrl.endsWith(".jsp")) { request.setAttribute("dateStr", DateFormatUtils.format( System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss")); } log.info("disUrl is : " + disUrl); // 将当前异步上下文所持有的request, response分发给Servlet容器 if (StringUtils.equals("self", disUrl)) { // 将分发到自身,即当前异步请求地址 asyncContext.dispatch(); } else { // 将分发到指定的路径 asyncContext.dispatch(disUrl); } } catch (InterruptedException e) { e.printStackTrace(); } } } }
当前请求完成之后,将分发到下一个请求上面,若都是异步的Servlet,则很好的组成了异步Servlet请求链。
有趣的地方在于,异步上下文环境可以分发到下一个异步或同步的servlet、jsp、html等资源。若访问类似于如下地址,当前URL永远不会断开,又一个永动机,除非网络链接出错或者服务器关闭。
http://localhost/servlet3/asyncDispatch2Async?disUrl=self
一个视图:
image
上面的异步Servlet总是在不断的请求自我,成为了一个永动机;为disUrl传入要转发到的异步或同步的资源地址,组成一个链的模式,相当的简单轻松。

 

分享到:
评论

相关推荐

    Servlet3.0参考手册

    开发者可以通过这个文件快速查找和理解Servlet3.0中的类、接口、方法以及它们的使用示例,对于学习和使用Servlet3.0非常有帮助。 总的来说,Servlet3.0通过增强的注解配置、异步处理、过滤器改进、上下文参数和监听...

    servlet 3.0 jar 包综合下载

    2. **异步处理**:Servlet 3.0支持异步处理,允许Servlet在处理请求时释放线程,提高服务器的并发性能。通过`HttpServletRequest.startAsync()`方法启动异步处理,然后在另一个线程中完成业务逻辑,最后调用`...

    servlet3.0.jar下载

    2. **异步处理**:Servlet 3.0引入了异步Servlet的概念,允许Servlet在处理请求时返回控制权给容器,然后在准备好响应时再重新获取控制权。这提高了性能,因为线程可以在等待I/O操作完成时被重用,而不是阻塞等待。 ...

    Servlet 3.0jar包和source包

    2. **异步处理**:Servlet 3.0引入了异步处理能力,允许Servlet在处理请求时启动一个后台线程,从而提高服务器性能。通过实现`AsyncContext`接口,开发者可以控制请求的生命周期,直到准备好返回响应。 3. **...

    servlet3.0.zip

    Servlet 3.0是Java Servlet规范的一个重要版本,它带来了许多新特性和改进,极大地提升了Web应用程序的开发效率和灵活性。这个压缩包“servlet3.0.zip”包含两个核心的JAR文件:“javax.servlet-javadoc.jar”和...

    Spring Boot实现异步请求(Servlet 3.0)

    Spring Boot 实现异步请求(Servlet 3.0) Spring Boot 实现异步请求是指在 Spring Boot 应用程序中使用异步处理机制来处理请求,以提高系统的性能和吞吐量。在 Spring 3.2 及以后版本中增加了对请求的异步处理,...

    servlet3.0推送聊天室

    Servlet 3.0作为Servlet规范的一个重要版本,引入了许多新特性,其中最引人注目的就是异步处理和支持Web插座(WebSocket),这使得实时通信如聊天室的实现变得更加便捷。本文将深入探讨如何利用Servlet 3.0的异步...

    servlet 3.0 异步 推送 聊天室

    Servlet 3.0引入了一种全新的特性,即异步处理能力,这极大地提高了Web应用程序的性能和响应性,尤其是在处理长时间运行的任务时。在传统的Servlet中,请求处理线程会一直占用,直到整个请求生命周期结束,这可能...

    servlet3.0 jar包和doc

    2. **异步处理**:Servlet3.0支持异步处理,允许Servlet在接收到请求后启动一个后台线程进行处理,而主线程可以立即返回,提高了服务器对高并发请求的响应能力。通过`HttpServletRequest.startAsync()`方法,开发者...

    Servlet3.0

    1. **异步Servlet**: 在Servlet 3.0之前,Servlet生命周期中的service()方法是同步执行的,这意味着每次请求都会占用一个线程直到响应完成。而Servlet 3.0引入了异步处理,允许开发者将请求处理逻辑移到一个新的线程...

    servlet3.0 规范pdf 包含javadoc

    1. **异步处理**:Servlet 3.0引入了异步处理能力,允许Servlet在请求处理过程中挂起并稍后恢复,而不是阻塞线程,这极大地提高了应用的并发性能。通过`AsyncContext`接口,开发者可以实现非阻塞I/O,以更高效地处理...

    maven servlet 3.0 eclipse config video

    在视频教程中,你将学习到如何在Eclipse中创建Maven Web项目,配置Servlet 3.0的相关注解,以及如何运行和调试基于Servlet 3.0的应用程序。这将帮助你更高效地开发和管理Java Web项目。 通过学习这个视频教程,...

    Servlet3.0特性详解

    Servlet3.0是Java EE平台中的一个重要组成部分,它在Servlet2.5的基础上引入了许多新特性,极大地提高了开发效率和灵活性。以下是对Servlet3.0主要特性的详细解释: 1. **注解配置**: 在Servlet3.0中,我们可以...

    Servlet 3.0 - Apache Tomcat 7.0.61

    Servlet 3.0是Java Web开发中的...通过注解驱动的编程模型和异步处理,可以构建更加高效的应用程序,同时,Tomcat的优化和安全管理确保了应用的稳定性和安全性。`servletapi`则为开发者提供了实现这些功能的基础工具。

    Jsp/Servlet3.0 ppt和代码

    1. **注解配置**:Servlet 3.0引入了注解,使得开发者可以在类或方法上直接声明Servlet、Filter和Listener,而无需在web.xml中进行繁琐的XML配置。例如,`@WebServlet("/example")` 就可以将一个类声明为Servlet并...

    servlet3.0相关的包

    Servlet3.0引入了注解驱动的部署,允许开发者通过在类或方法上添加注解来定义Servlet、过滤器和监听器,从而避免了繁琐的web.xml配置。此外,还支持异步处理,使得Servlet可以在处理请求时释放线程,提高服务器性能...

    Servlet3.0 Demo

    Servlet3.0是Java Web开发中的一个重要里程碑,它在Servlet2.5的基础上引入了许多新特性,极大地提高了开发效率和灵活性。在这个"Servlet3.0 Demo"项目中,我们可以看到一个典型的使用Servlet3.0特性的示例。以下是...

    servlet3.0-demo

    Servlet 3.0是Java EE 6规范的一部分,它带来了许多增强的功能,使得Web应用程序的开发更为便捷和灵活。在这个名为“servlet3.0-demo”的项目中,我们重点探讨的是如何利用Servlet 3.0的新特性进行文件上传操作,...

    servlet3.0

    Servlet 3.0是Java Servlet规范的一个重要版本,它在原有的Servlet 2.x基础上引入了多项新特性,极大地提升了Web应用程序的开发效率和灵活性。在这个版本中,servlet-api.jar作为核心库,包含了运行Servlet应用所...

Global site tag (gtag.js) - Google Analytics