⑩异步处理
异步 处理
2023-09-14 08:58:48 时间
前言
系列出品:http://www.cnblogs.com/Alandre/category/552859.html
Servlet3.0提供异步处理
在以前的Servlet规范化,如果Servlet作为控制器调用了一个耗时的业务方法,那么必须等到业务方法完全返回之后才能生成响应,这将使用Servlet对业务方法的调用变成一种阻塞式的调用,因此效率比较低。
Servlet3.0规范引入了异步处理来解决这个问题,异步处理允许Servlet重新发起一条新线程去调用 耗时业务方法,这样就可以避免等待。
Servlet3.0的异步处理是通过AsyncContext类来处理的,Servlet可通过ServletRequest的如下两个方法开启异步调用,创建AsyncContext对象:
AsyncContext startAsync()
AsyncContext startAsync(ServletRequest,ServletResponse)
异步处理类AsyncServlet.java
package aniyo.servlet.async; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; import javax.servlet.AsyncContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet 3.0提供的异步处理 * 异步操作通过AsyncContext类来处理,通过startAsync()方法来开启异步调用 * @author aniyo * blog:http://aniyo.iteye.com * */ @WebServlet(name="asyncServle",urlPatterns="/asyncServlet",asyncSupported=true) public class AsyncServlet extends HttpServlet { /* (non-Javadoc) * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=GBK"); PrintWriter out = response.getWriter(); out.println("<title>异步调用示例</title>"); out.println("进入Servlet的时间:"+new Date()+".<br/>"); out.flush(); //创建AsyncContext,开始异步调用 AsyncContext actx = request.startAsync(); //设置异步调用的超时时长 actx.setTimeout(30*1000); //启动异步调用的线程 actx.start(new Executor(actx)); out.println("结束Servlet的时间:"+new Date()+".<br/>"); out.flush(); } }
线程类Executor.java
package aniyo.servlet.async; import java.util.ArrayList; import java.util.List; import javax.servlet.AsyncContext; import javax.servlet.ServletRequest; public class Executor implements Runnable{ private AsyncContext actx = null; public Executor(AsyncContext actx) { this.actx = actx; } /* (non-Javadoc) * @see java.lang.Runnable#run() */ @Override public void run() { //等待5秒 try { Thread.sleep(5*1000); ServletRequest request = actx.getRequest(); List<String> books = new ArrayList<String>(); books.add("java"); books.add("oracle"); books.add("j2ee"); request.setAttribute("books", books); actx.dispatch("/async.jsp"); } catch (InterruptedException e) { e.printStackTrace(); } } }
async.jsp
<%@page import="java.util.Date"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" session="false"%> <%@ taglib prefix = "c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <ul> <c:forEach items="${books}" var="book"> <li> ${book } </li> </c:forEach> </ul> <%out.println("业务调用结束的时间:"+ new Date()); //完成异步调用 //request.getAsyncContext().complete(); %> </body> </html>
相关文章
- Generator 异步原理
- 【第十四篇】商城系统-异步处理利器-CompletableFuture
- 大话大型系统架构绝技之一“异步”
- 33·灵魂前端工程师养成-[前后分离]异步与promise
- Spring任务调度与异步处理
- 定时任务@Scheduled 和 异步@Async
- BoostAsyncSocket 异步反弹通信案例
- 【Android 异步操作】手写 Handler ( Message 消息 | ThreadLocal 线程本地变量 | Looper 中的消息队列 MessageQueue )
- 【Kotlin 协程】Flow 异步流 ④ ( 流的构建器函数 | flow 构建器函数 | flowOf 构建器函数 | asFlow 构建器函数 )
- Redis 应用实践-消息队列-异步处理
- python-异步IO编程
- python-异常处理和错误调试-异步IO程序的调试方法(二)
- 简单高效的代码优化-事务后异步处理
- 异步API的精彩之处:Redis实现快速响应(redis异步api)
- Linux下的异步机制研究(linux异步机制)
- Redis消息中间件:解决异步消息传输问题(redis消息中间件)
- Linux线程:实现异步处理的高效方案(linux线程异步)
- 处理C与MySQL结合,实现异步处理(cmysql异步)
- 处理Oracle作业的异步执行挑战与机遇(oracle作业异步)
- 基于Redis的异步处理技术发展现状(基于redis的异步处理)
- Redis队列入门攻略精通异步任务处理(redis队列攻略)
- AJAX异步从优酷专辑中采集所有视频及信息(JavaScript代码)
- Ajax请求中的异步与同步,需要注意的地方说明
- js中同步与异步处理的方法和区别总结
- android开发教程之handle实现多线程和异步处理