@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
阅读全文
0 0
- @Async异步注解
- spring @Async 注解异步执行
- Spring异步方法注解@Async
- Spring异步方法注解 @Async
- spring boot 集成Async 注解 异步处理
- Spring中的@Async注解 异步任务处理
- Spring中异步处理@Async注解
- Spring的好用注解之异步注解@Async
- spring 异步方法(@Async注解代替多线程 )
- spring中使用@Async注解进行异步处理
- Spring中@Async注解实现方法的异步调用
- Spring中@Async注解实现“方法”的异步调用
- spring中使用@Async注解进行异步处理
- spring boot 使用注解@async实现异步调用
- Spring中@Async注解实现方法的异步调用
- Spring源码学习之:@Async 方法上添加该注解实现异步调用的原理
- SpringCloud(第 047 篇)注解式Async配置异步任务
- Java并发编程:Spring中使用 @async 注解实现异步调用的原理
- JCO与bapi的联合使用
- POJ 1068:Parencodings(模拟)
- HDFS的java操作
- GigE Vision简介
- I NEED A OFFER! HDU 1203
- @Async异步注解
- poj 2769 Reduced ID Numbers (同余定理)
- CSS核心属性
- 20170802题目
- 关于Spring中的<context:annotation-config/>配置
- [__NSCFConstantString size]: unrecognized selector sent to instance 错误
- C语言基础(六)指针和多维数组
- STL vector
- 定时任务--在Spring 中配置Quartz