介绍
- 为了支持异步处理,在Servlet 3.0中,在ServletRequest上提供了startAsync()方法
配置
SpringMVC支持异步配置
- springmvc-servlet.xml:
- <mvc:annotation-driven>
- <mvc:async-support default-timeout="5000"/>
- mvc:annotation-driven>
- web.xml的所有servlet和filter
- <async-supported>trueasync-supported>
示例
- @Controller
- @RequestMapping("/test")
- public class AsyncTestController extends BaseController {
- @RequestMapping(value = "/async", method = RequestMethod.GET)
- public void testAsync(HttpServletRequest request, HttpServletResponse response) throws IOException {
- LOGGER.info("=== 开始");
- PrintWriter out = response.getWriter();
- AsyncContext asyncContext = request.startAsync();
- asyncContext.setTimeout(5000L); // 设置0表示永不超时
- asyncContext.addListener(new TestAsyncListener());
- new Thread(new WorkThread(asyncContext)).start();
- LOGGER.info("=== 异步进行中");
- out.println("async exce...");
- }
- }
- public class WorkThread implements Runnable {
- private AsyncContext asyncContext;
- public WorkThread(AsyncContext asyncContext) {
- this.asyncContext = asyncContext;
- }
- @Override
- public void run() {
- try {
- Thread.sleep(6000);
- try {
- ServletResponse response = asyncContext.getResponse();
- PrintWriter out = response.getWriter();
- out.println("work thread excute is finished!");
- // out.close(); // 可以放到listener.onComplete里面关闭
- } catch (IOException e) {
- e.printStackTrace();
- }
- asyncContext.complete();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- public class TestAsyncListener implements AsyncListener {
- @Override
- public void onComplete(AsyncEvent asyncEvent) throws IOException {
- try {
- AsyncContext asyncContext = asyncEvent.getAsyncContext();
- ServletResponse response = asyncContext.getResponse();
- ServletRequest request = asyncContext.getRequest();
- PrintWriter out= response.getWriter();
- if (request.getAttribute("timeout") != null &&
- StringUtil.equals("true",request.getAttribute("timeout").toString())) {//超时
- out.println("onComplete timeout ");
- LOGGER.info("onComplete timeout");
- }else {//未超时
- out.println("OnComplete normal");
- LOGGER.info("OnComplete normal");
- }
- out.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- @Override
- public void onError(AsyncEvent asyncEvent) throws IOException {
- LOGGER.info("=== onError");
- }
- @Override
- public void onStartAsync(AsyncEvent arg0) throws IOException {
- LOGGER.info("=== onStartAsync");
- }
- @Override
- public void onTimeout(AsyncEvent asyncEvent) throws IOException {
- ServletRequest request = asyncEvent.getAsyncContext().getRequest();
- request.setAttribute("timeout", "true");
- LOGGER.info("=== onTimeout");
- }
- }
总结
Listener.onComplete方法永远都会执行;
Listener.onTimeout方法在超时时才会执行。
其他的东西可以复制demo自己跑一下看一下就明白了。