异步servlet
来源:互联网 发布:神舟游戏本 知乎 编辑:程序博客网 时间:2024/05/16 12:37
异步处理支持
Servlet 3.0 之前,一个普通 Servlet 的主要工作流程大致如下:首先,Servlet 接收到请求之后,可能需要对请求携带的数据进行一些预处理;接着,调用业务接口的某些方法,以完成业务处理;最后,根据处理的结果提交响应,Servlet 线程结束。其中第二步的业务处理通常是最耗时的,这主要体现在数据库操作,以及其它的跨网络调用等,在此过程中,Servlet 线程一直处于阻塞状态,直到业务方法执行完毕。在处理业务的过程中,Servlet 资源一直被占用而得不到释放,对于并发较大的应用,这有可能造成性能的瓶颈。对此,在以前通常是采用私有解决方案来提前结束 Servlet 线程,并及时释放资源。
Servlet 3.0 针对这个问题做了开创性的工作,现在通过使用 Servlet 3.0 的异步处理支持,之前的 Servlet 处理流程可以调整为如下的过程:首先,Servlet 接收到请求之后,可能首先需要对请求携带的数据进行一些预处理;接着,Servlet 线程将请求转交给一个异步线程来执行业务处理,线程本身返回至容器,此时 Servlet 还没有生成响应数据,异步线程处理完业务以后,可以直接生成响应数据(异步线程拥有 ServletRequest 和 ServletResponse 对象的引用),或者将请求继续转发给其它 Servlet。如此一来, Servlet 线程不再是一直处于阻塞状态以等待业务逻辑的处理,而是启动异步线程之后可以立即返回。
模拟异步处理的 Servlet 示例
WebServlet(urlPatterns = "/demo", asyncSupported = true)public class AsyncDemoServlet extends HttpServlet { @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { resp.setContentType("text/html;charset=UTF-8"); PrintWriter out = resp.getWriter(); out.println("进入Servlet的时间:" + new Date() + "."); out.flush(); //在子线程中执行业务调用,并由其负责输出响应,主线程退出 AsyncContext ctx = req.startAsync(); ctx.addListener(new AsyncListener() { public void onComplete(AsyncEvent asyncEvent) throws IOException { // 做一些清理工作或者其他 } ... }); new Thread(new Executor(ctx)).start(); out.println("结束Servlet的时间:" + new Date() + "."); out.flush(); }}public class Executor implements Runnable { private AsyncContext ctx = null; public Executor(AsyncContext ctx){ this.ctx = ctx; } public void run(){ try { //等待十秒钟,以模拟业务方法的执行 Thread.sleep(10000); PrintWriter out = ctx.getResponse().getWriter(); out.println("业务处理完毕的时间:" + new Date() + "."); out.flush(); ctx.complete(); } catch (Exception e) { e.printStackTrace(); } }}
一个请求的调用过程如下:
其实“超时处理线程”和“回调处理线程”可能都是线程池中的某个线程,为了使得逻辑清晰特意把它们分开画而已
- 异步servlet
- 异步servlet
- 异步servlet
- 异步Servlet
- Servlet 3特性:异步Servlet
- Servlet 3特性:异步Servlet
- Servlet 3特性:异步Servlet
- Servlet 3特性:异步Servlet
- Servlet 3特性:异步Servlet
- 由异步servlet所想
- JavaEE6-异步Servlet Sample
- servlet3.0异步servlet
- Servlet异步处理数据
- Servlet3 -- Servlet异步处理
- Servlet-异步执行AsyncContext
- Servlet 3.0异步处理
- servlet异步调用
- Servlet的异步处理
- USACO-Humble Numbers(递推)
- python选取特定列——pandas的iloc和loc以及icol使用(列切片及行切片)
- 学习列表
- OpenCV_(Based on Sobel Filter to Detect edges) 基于Sobel算子的方向滤波器检查边缘
- 大数据时代的大数据
- 异步servlet
- linux 相关知识
- 让Monkey在你的应用上蹦起来
- android应用程序启动详情之进程相关
- POJ2251-Dungeon Master (三维BFS)
- BIOS的作用
- POI导出Excel代码实例(设置字体,边框,合并单元格,其它功能以后探索到继续更新)
- 校验dubbo类型的数据是否为正整数
- 数据库常用语句