JavaEE6-异步Servlet Sample
来源:互联网 发布:软件开发基础培训 编辑:程序博客网 时间:2024/06/05 19:35
个人理解:
异步Servlet工作方式在主线程基础之上再新开一个子线程来处理比较耗时的任务,两个线程共用一个socket连接,所以在连接的关闭上需小心。
异步Servlet代码:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */package me.ypqiao.javaee6sample.listener;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.AsyncContext;import javax.servlet.AsyncEvent;import javax.servlet.AsyncListener;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;/** * * @author ypqiao */@WebServlet(name = "AsynServlet", urlPatterns = {"/AsynServlet"}, asyncSupported = true)public class AsynServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); try { out.println(" work1 completed <br/>"); // get and config an instance of AsyncContext AsyncContext ctx = request.startAsync(); ctx.setTimeout(2000); ctx.addListener( new AsyncContextListener() ); // start the asynccontext to do ayncwork ctx.start( new AsyncTask(ctx)); out.println(" work3 completed <br/>"); } finally { out.flush(); } }}class AsyncTask implements Runnable { private static Log log = LogFactory.getLog(AsyncTask.class); private AsyncContext context; public AsyncTask(AsyncContext context){ this.context = context; } @Override public void run() { log.info(" start to do a long-time work "); try { Thread.sleep(2000); context.getResponse().getWriter().print(" work2 completed <br/>"); //throw new RuntimeException(" exception test "); } catch( Exception e ){ log.error(e.getMessage(),e); } finally{ context.complete(); } }}class AsyncContextListener implements AsyncListener{ private static Log log = LogFactory.getLog(AsyncContextListener.class); @Override public void onComplete(AsyncEvent event) throws IOException { log.info(" the asyn context has been completed "); } @Override public void onTimeout(AsyncEvent event) throws IOException { log.warn(" the asyn context has been timeout "); } @Override public void onError(AsyncEvent event) throws IOException { log.error(" the asyn context has error ",event.getThrowable()); } @Override public void onStartAsync(AsyncEvent event) throws IOException { log.debug(" the asyn context has started ",event.getThrowable()); } }
- JavaEE6-异步Servlet Sample
- servlet sample
- Servlet Filters 简单sample
- 异步servlet
- 异步servlet
- 异步servlet
- 异步Servlet
- A Sample Servlet Application (WML, Java)
- Servlet 3特性:异步Servlet
- Servlet 3特性:异步Servlet
- Servlet 3特性:异步Servlet
- Servlet 3特性:异步Servlet
- Servlet 3特性:异步Servlet
- 由异步servlet所想
- servlet3.0异步servlet
- Servlet异步处理数据
- Servlet3 -- Servlet异步处理
- Servlet-异步执行AsyncContext
- Android--SoftReference缓存图片
- CATransform3D 矩阵变换之立方体旋转实现细节
- 老码农教你学英语:补充一些英语学习素材
- 最好自己手动敲下代码,对理解有很大帮助。
- ora-00054:resource busy and acquire with nowait specified解决方法
- JavaEE6-异步Servlet Sample
- More Effective C++:理解new和delete
- Android TextProgressBar
- Berkeley DB 的简介
- POJ1000
- MySQL分区表
- Nginx配置文件详细说明
- 用PHP对一张图片进行九宫格位置的随机水印添加 (个人学习笔记)
- Overview of HEVC之5 帧间预测