在ServletRequest中增加的有关异步相关方法分为:
-
startAsync(servletRequest, servletResponse) 传入指定的request和response对象,便于在AsyncContext中重复使用(这样被Filter、Servlet包装过的请求、相应对象才会在异步的环境下继续生效)。
-
startAsync() 若request或者response被包装,将失去预期的效果。
-
isAsyncSupported() 和 isAsyncStarted()
辅助性的方法,用于判断当前请求是否支持异步或者异步已经开始。
-
getAsyncContext()
需要在异步启动之后才能够访问,否则会报异常。
在AsyncContext中分发的方法有三个,不太容易区分:
-
AsyncContext.dispatch()
若当前AsyncContext由ServletRequest.startAsync(ServletRequest, ServletResponse)方法启动,返回的地址可以通过HttpServletRequest.getRequestURI()得到。
否则,分发的地址则是当前URL request对象最后一次分发的地址。
虽有些拗口,两者分发的地址大部分情况下一致;但尽量使用带有参数的异步上下文启动器。
如本例中请求/asyncDispatch2Async?disUrl=self,执行dispatch()方法之后,自身会再次分发到自身,包括传递的参数。
-
AsyncContext.dispatch(String path)
等同于ServletRequest.getRequestDispatcher(String),
算是一个快捷方法。
可以转向一个同步或异步的servlet,或者JSP,或其它资源地址等。
-
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
一个视图:
上面的异步Servlet总是在不断的请求自我,成为了一个永动机;为disUrl传入要转发到的异步或同步的资源地址,组成一个链的模式,相当的简单轻松。
分享到:
相关推荐
开发者可以通过这个文件快速查找和理解Servlet3.0中的类、接口、方法以及它们的使用示例,对于学习和使用Servlet3.0非常有帮助。 总的来说,Servlet3.0通过增强的注解配置、异步处理、过滤器改进、上下文参数和监听...
2. **异步处理**:Servlet 3.0支持异步处理,允许Servlet在处理请求时释放线程,提高服务器的并发性能。通过`HttpServletRequest.startAsync()`方法启动异步处理,然后在另一个线程中完成业务逻辑,最后调用`...
2. **异步处理**:Servlet 3.0引入了异步Servlet的概念,允许Servlet在处理请求时返回控制权给容器,然后在准备好响应时再重新获取控制权。这提高了性能,因为线程可以在等待I/O操作完成时被重用,而不是阻塞等待。 ...
2. **异步处理**:Servlet 3.0引入了异步处理能力,允许Servlet在处理请求时启动一个后台线程,从而提高服务器性能。通过实现`AsyncContext`接口,开发者可以控制请求的生命周期,直到准备好返回响应。 3. **...
Servlet 3.0是Java Servlet规范的一个重要版本,它带来了许多新特性和改进,极大地提升了Web应用程序的开发效率和灵活性。这个压缩包“servlet3.0.zip”包含两个核心的JAR文件:“javax.servlet-javadoc.jar”和...
Spring Boot 实现异步请求(Servlet 3.0) Spring Boot 实现异步请求是指在 Spring Boot 应用程序中使用异步处理机制来处理请求,以提高系统的性能和吞吐量。在 Spring 3.2 及以后版本中增加了对请求的异步处理,...
Servlet 3.0作为Servlet规范的一个重要版本,引入了许多新特性,其中最引人注目的就是异步处理和支持Web插座(WebSocket),这使得实时通信如聊天室的实现变得更加便捷。本文将深入探讨如何利用Servlet 3.0的异步...
Servlet 3.0引入了一种全新的特性,即异步处理能力,这极大地提高了Web应用程序的性能和响应性,尤其是在处理长时间运行的任务时。在传统的Servlet中,请求处理线程会一直占用,直到整个请求生命周期结束,这可能...
2. **异步处理**:Servlet3.0支持异步处理,允许Servlet在接收到请求后启动一个后台线程进行处理,而主线程可以立即返回,提高了服务器对高并发请求的响应能力。通过`HttpServletRequest.startAsync()`方法,开发者...
1. **异步Servlet**: 在Servlet 3.0之前,Servlet生命周期中的service()方法是同步执行的,这意味着每次请求都会占用一个线程直到响应完成。而Servlet 3.0引入了异步处理,允许开发者将请求处理逻辑移到一个新的线程...
1. **异步处理**:Servlet 3.0引入了异步处理能力,允许Servlet在请求处理过程中挂起并稍后恢复,而不是阻塞线程,这极大地提高了应用的并发性能。通过`AsyncContext`接口,开发者可以实现非阻塞I/O,以更高效地处理...
在视频教程中,你将学习到如何在Eclipse中创建Maven Web项目,配置Servlet 3.0的相关注解,以及如何运行和调试基于Servlet 3.0的应用程序。这将帮助你更高效地开发和管理Java Web项目。 通过学习这个视频教程,...
Servlet3.0是Java EE平台中的一个重要组成部分,它在Servlet2.5的基础上引入了许多新特性,极大地提高了开发效率和灵活性。以下是对Servlet3.0主要特性的详细解释: 1. **注解配置**: 在Servlet3.0中,我们可以...
Servlet 3.0是Java Web开发中的...通过注解驱动的编程模型和异步处理,可以构建更加高效的应用程序,同时,Tomcat的优化和安全管理确保了应用的稳定性和安全性。`servletapi`则为开发者提供了实现这些功能的基础工具。
1. **注解配置**:Servlet 3.0引入了注解,使得开发者可以在类或方法上直接声明Servlet、Filter和Listener,而无需在web.xml中进行繁琐的XML配置。例如,`@WebServlet("/example")` 就可以将一个类声明为Servlet并...
Servlet3.0引入了注解驱动的部署,允许开发者通过在类或方法上添加注解来定义Servlet、过滤器和监听器,从而避免了繁琐的web.xml配置。此外,还支持异步处理,使得Servlet可以在处理请求时释放线程,提高服务器性能...
Servlet3.0是Java Web开发中的一个重要里程碑,它在Servlet2.5的基础上引入了许多新特性,极大地提高了开发效率和灵活性。在这个"Servlet3.0 Demo"项目中,我们可以看到一个典型的使用Servlet3.0特性的示例。以下是...
Servlet 3.0是Java EE 6规范的一部分,它带来了许多增强的功能,使得Web应用程序的开发更为便捷和灵活。在这个名为“servlet3.0-demo”的项目中,我们重点探讨的是如何利用Servlet 3.0的新特性进行文件上传操作,...
Servlet 3.0是Java Servlet规范的一个重要版本,它在原有的Servlet 2.x基础上引入了多项新特性,极大地提升了Web应用程序的开发效率和灵活性。在这个版本中,servlet-api.jar作为核心库,包含了运行Servlet应用所...