@Async异步注解

来源:互联网 发布:安装网络打印机 编辑:程序博客网 时间:2024/06/07 22:09

前端:

 

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <base href="<%=basePath%>">    <meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">    <title>RequestParam测试</title><script type="text/javascript" src="<%=basePath %>js/jquery-1.8.3.min.js"></script>    <script type="text/javascript" src="<%=basePath %>js/jquery.cookie.js"></script><script type="text/javascript">    var timerId = null;//定时器ID    $(document).ready(function () {        /*         定时轮询执行进度         */        timerId = setInterval(function () {            getStatus();        }, 1000);        getStatus();    });    /**     获取执行进度     */    function getStatus() {        var statusUrl = '<%=basePath%>rpc/async/status';        $.get(statusUrl, function (data) {        console.log(data);            if (data == null || data == null || data == "null") {                updateStatus("准备中");                return ;            }            var status = data;                     var temp = status.split("/");            updateStatus(status);            if (temp[0] ==temp[1]) {                updateStatus("完成");                clearInterval(timerId);//停止定时器                clearStatus();//清理redis缓存            }        })    }    /**     * 执行完成后,清理缓存     */    function clearStatus() {        var clearStatusUrl = '<%=basePath%>rpc/async/clear';        $.get(clearStatusUrl, function (data) {        })    }    /**     更新进度显示     */    function updateStatus(msg) {        $("#status").html(msg);    }</script></head><body><div id="msgBox">    <span>请稍候,服务器正在处理中...</span>    <h1>当前处理进度:<span style="color:red" id="status">准备中</span></h1></div></body></html>
    后台控制层:

@RequestMapping(value = "/async/asyncTest")    public String asyncTest(HttpServletRequest req,                            HttpServletResponse resp, HttpSession session) throws Exception {        asyncService.asyncMethod( session);        return "async";    }        @RequestMapping(value = "/async/status")    public void showAsyncStatus(HttpServletRequest req,                                  HttpServletResponse resp, HttpSession session) throws Exception {        String status = asyncService.getProcess(session);        resp.getWriter().print(status);        //return null;    }    @RequestMapping(value = "/async/clear")    public void clearAsyncStatus(HttpServletRequest req,                                   HttpServletResponse resp, HttpSession session) throws Exception {        asyncService.clearCache(session);        //resp.getWriter().print("ok");        //System.out.println(session.getAttribute("cacheKey"));        //return null;    }
后台service:

package com.htxx.service.business;import javax.servlet.http.HttpSession;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.scheduling.annotation.Async;import org.springframework.stereotype.Service;@Servicepublic class AsyncServiceImpl implements AsyncService{        @Override    @Async    public void asyncMethod( HttpSession session) throws Exception {        //模拟总有20个步骤,每个步骤耗时2秒        int maxStep = 10;        for (int i = 0; i < maxStep; i++) {        System.out.println(i);            Thread.sleep(1000);            //将执行进度放入缓存            session.setAttribute("cacheKey", (i + 1) + "/" + maxStep);        }    }    @Override    public String getProcess( HttpSession session) throws Exception {        return (String) session.getAttribute("cacheKey");    }    @Override    public void clearCache( HttpSession session) throws Exception {        //完成后,清空缓存        session.setAttribute("cacheKey","0/10");    //session.removeAttribute("cacheKey");    }}
  浏览器:http://localhost:8090/MyLab/rpc/async/asyncTest

  在asyncTest方法里会调用service中一个for循环,这个for循环大约会执行10秒,然后再跳转到"async.jsp"

加上@async注解后,asyncTest方法不必等到for循环完全结束再跳转到"async.jsp",在jsp页面内有setInterval循环查询后台session内的值,

将结果显示在页面上

效果显示:

--------------------------------------------------------遇到的问题------------------------------------------------------------------------------------------------

加了注解没反应,等到for循环结束后才进入页面:

解决办法:

在springmvc配置文件内加:

  <task:annotation-driven executor="asyncExecutor" />   <task:executor id="asyncExecutor" pool-size="100-10000" queue-capacity="10"/>  
-----------------------------------------------------参考-------------------------------------------------------------------------------------------------------

http://www.cnblogs.com/yjmyzz/p/how-to-use-Async-annotation-in-spring-mvc.html


原创粉丝点击