@Async java 异步方法
在spring 3中,@Async注解能让某个方法快速变为异步执行,马上来先DEMO上手下。
假如在网站的用户注册后,需要发送邮件,然后用户得到邮件确认后才能继续其他工作;
假设发送是一个很耗费时间的过程,因此需要异步。
1 namespace要注意,加上task
- <?xml version=”1.0″ encoding=”UTF-8″?>
- <beans xmlns=”http://www.springframework.org/schema/beans” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
- xmlns:p=”http://www.springframework.org/schema/p” xmlns:context=”http://www.springframework.org/schema/context”
- xsi:schemaLocation=”
- http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
- http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd”>
- <context:component-scan base-package=”cs”/>
- </beans>
2 RegularService.java 注册类
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- import cs.async.MailUtility;
- @Service
- public class RegularService {
- @Autowired
- private MailUtility mailUtility ;
- public void registerUser(String userName){
- System.out.println(” User registration for “+userName +” complete”);
- mailUtility.sendMail(userName);
- System.out.println(” 注册完成,邮件稍后发送“);
- }
- }
- 3 发送邮件的工具类
- <pre name="code" class="java">import org.springframework.scheduling.annotation.Async;
- import org.springframework.stereotype.Component;
- @Component
- public class MailUtility {
- @Async
- public void sendMail(String name){
- System.out.println(” 在做发送准备工作中 “);
- try {
- Thread.sleep(5000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println(” 异步发送完毕“);
- }
- }
- </pre>
- <br>
- <br>4 最后在applicationContext.xml中加入:
- <br> <pre name="code" class="java"><?xml version=”1.0″ encoding=”UTF-8″?>
- <beans xmlns=”http://www.springframework.org/schema/beans” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
- xmlns:p=”http://www.springframework.org/schema/p” xmlns:context=”http://www.springframework.org/schema/context”
- xmlns:task=”http://www.springframework.org/schema/task”
- xsi:schemaLocation=”
- http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
- http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd“>
- <context:component-scan base-package=”cs”/>
- <task:annotation-driven/>
- </beans>
- </pre>
- <br> 就是<task:annotation-driven/>这个一定不能少喔。
- <br>
- <br>5 运行:
- <br> User registration for tom complete
- <br> 注册完成,邮件稍后发送
- <br>在做发送准备工作中
- <br>异步发送完毕
- <br>
- <br>6 有的时候,要从异步中返回值,这个时候,spring会返回一个java.util.concurrent.Future对象,要调用其中的get方法,比如
- <br> <pre name="code" class="java">@Async
- public Future<Balance> findBalanceAsync(final Account account) {
- Balance balance = accountRepository.findBalance(account);
- return new AsyncResult<Balance>(balance);
- }
- Balance balance = future.get();
- </pre>
- <br>
- <br>
- 注意事项:必须解决循环依赖
- 原理: spring 在扫描bean的时候会扫描方法上是否包含@async的注解,如果包含的,spring会为这个bean动态的生成一个子类,我们称之为代理类(?),代理类是继承我们所写的bean的,然后把代理类注入进来,那此时,在执行此方法的时候,会到代理类中,代理类判断了此方法需要异步执行,就不会调用父类(我们原本写的bean)的对应方法。spring自己维护了一个队列,他会把需要执行的方法,放入队列中,等待线程池去读取这个队列,完成方法的执行,从而完成了异步的功能。
-
今天对项目工程(spring3.0.6+structs2.2.3)进行瘦身,业务层bean统一用@Service注解,set注入用@Autowired替换,从xml配置文件中将业务bean配置全部清掉。
这时专门处理异步操作的bean报循环依赖(引用):
Bean with name ‘*********’ has been injected into other beans [******, **********, **********, **********] in its raw version as part of a circular reference具体情况是beanA注入用于异步处理的beanB(含有@Async注解的方法),用于对某些操作进行异步处理,而beanB又注入beanA用于实现异步处理
解决方案:beanA注入异步处理的beanB的代理服务beanC(不含@Async注解),再由beanC注入beanB进行处理
@Async java 异步方法的更多相关文章
- 使用Spring的@Async创建异步方法
使用Spring的@Async创建异步方法 在开发系统的过程中,通常会考虑到系统的性能问题,提升系统性能的一个重要思想就是“串行”改“并行”.说起“并行”自然离不开“异步”,今天我们就来聊聊如何使用S ...
- asyn4j -- java 异步方法调用框架
asyn4j 是一个java异步方法调用框架,基于消费者与生产者模式.包括了异步方法执行,异步回调执行,异步工作缓存模块.支持Spring. 让我们写异步方法不再写很多的相关多线程代码.用asyn4j ...
- C#学习日志 day8 -------------- async await 异步方法入门(引用博客)以及序列化和反序列化的XML及json实现
首先是异步方法的介绍,这里引用自http://www.cnblogs.com/LoveJenny/archive/2011/11/01/2230933.html async and await 简单的 ...
- Spring异步方法注解 @Async
@Async 0. 介绍 在Spring 3.x之后,通过内置@Async标明异步方法,可以简化异步开发流程. @Async既可提供无返回值的调用,也可提供有返回值的调用,下文将分别介绍两种使用方式. ...
- SpringBoot线程池的创建、@Async配置步骤及注意事项
最近在做订单模块,用户购买服务类产品之后,需要进行预约,预约成功之后分别给商家和用户发送提醒短信.考虑发短信耗时的情况所以我想用异步的方法去执行,于是就在网上看见了Spring的@Async了. 但是 ...
- @Async的用法和示例
@Async 注解的用法和示例 目录 @Async 注解的用法和示例 背景 异步调用 @Async介绍 在Spring中启用@Async 示例一:基本使用方式 示例二:在同一个类中调用异步方法 示例三 ...
- C#~异步编程再续~await与async引起的w3wp.exe崩溃
返回目录 最近怪事又开始发生了,IIS的应用程序池无做挂掉,都指向同一个矛头,async,threadPool,Task,还有一个System.NullReferenceException,所以这些都 ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- .NET4.5 异步编程 async和await
msdn介绍:https://msdn.microsoft.com/zh-cn/library/hh191443.aspx 其实很简单,标记了async的方法为异步方法,从方法的左大括号开始同步执行, ...
随机推荐
- 【HTTP】POST 与 PUT 方法区别
1. POST 用于向服务端发送数据,常用于表单数据提交: PUT 用于向服务器上的资源(如文件)中存储数据: 2. 302 303 307 状态码区别 他们都是重定向(临时重定向 p.s 301 ...
- CODESOFT中的圆角矩形的弧度该怎样设置?
CODESOFT标签设计软件提供多种图形制作按钮,方便用户更为快捷的制作标签.其中就包括矩形,圆角矩形的快捷创建按钮.本文将介绍如何设置CODESOFT圆角矩形的弧度. 若有疑问可直接访问:htt ...
- 用C#编写游戏脚本
大学宿舍玩游戏的时候,为了简化重复的键鼠动作,有学习过按键精灵和TC脚本开发工具,并做了一些小脚本,基本达到了当时的需求.不知不觉,已经毕业了3年了,无聊之余又玩起了游戏,对于一些无趣的重复行为,于是 ...
- maven的安装与配置
1.下载相应版本的maven安装包(压缩文件) http://maven.apache.org/download.cgi 2.环境变量配置 将下载的压缩包解压. 计算机===>属性=====&g ...
- flex安装时停在计算时间界面的解决办法
现象:安装FLEX BUILDER4.6时停在计算时间界面,过了一会后弹出安装失败的对话框. 环境:WIN7 解决: 1.下载AdobeCreativeCloudCleanerTool, 地址:htt ...
- 慕课网-安卓工程师初养成-2-2 认识Java标识符
来源:http://www.imooc.com/code/1177 问:标识符是神马? 答:标识符就是用于给 Java 程序中变量.类.方法等命名的符号. 使用标识符时,需要遵守几条规则: 1. 标 ...
- python中get、post数据
方法一:urllib2 参考:http://www.cnblogs.com/chenzehe/archive/2010/08/30/1812995.html post: #!/usr/bin/pyth ...
- CODEVS 1036 商务旅行
题目描述 Description 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任 ...
- 华为OJ平台——杨辉三角的变形
import java.util.Scanner; /** * 杨辉三角的变形 *第一行为1,后面每一行的一个数是其左上角到右上角的数的和,没有的记为0 * 1 * 1 1 1 * 1 2 3 2 1 ...
- com组件 Ieframe的主页锁定
CLSID 里的ieframe的 shell OpenHomePage-> Command的默认项"C:\Program Files (x86)\Internet Explorer\i ...