spring3支持@Async注解的异步任务,之前大家都是通过使用如线程池来完成,spring3也是使用这种方式,但更简单。
其具体实现在:org.springframework.aop.interceptor.AsyncExecutionInterceptor,是一个方法拦截器,其invoke方法的部分代码如下:
Future<?> result = determineAsyncExecutor(specificMethod).submit( new Callable<Object>() { public Object call() throws Exception { try { Object result = invocation.proceed(); if (result instanceof Future) { return ((Future<?>) result).get(); } } catch (Throwable ex) { ReflectionUtils.rethrowException(ex); } return null; } });
即把当前任务的调用提交给线程池,很简单。
1、测试无事务的异步任务
这个相对来说比较简单:
1.1、设置任务的返回值为Future:
public Future sendSystemMessage(Long[] receiverIds, Message message);
1.2、调用future.get();等待任务结束。
Future future = messageApi.sendSystemMessage(userIds, message); future.get();
这个很简单。
2、测试带事务的异步任务
因为是带事务的,所以异步任务肯定要启动一个线程来执行任务,所以无法在主线程回滚,造成数据会commit到数据库,这在集成测试时肯定是不行的;解决方案是移除异步任务:
2.1、使用spring profile,在测试环境下不执行<task:annotation-driven>即可。
2.2、使用我提供的工具类,在测试时移除异步支持即可:
//移除异步支持 if(AopProxyUtils.isAsync(messageApi)) { AopProxyUtils.removeAsync(messageApi); }
测试类可以参考MessageApiServiceIT.java
工具类下载 AopProxyUtils.java
3、包级别测试
@Async public void sendSystemMessage() { sendSystemMessageInner(); } void sendSystemMessageInner() { //测试时测试这个方法即可 }
这样测试时测试这个包级别的sendSystemMessageInner方法即可
其实更好的做法是spring内部提供支持,支持这样异步调用的测试。
相关推荐
@scheduled任务调度使用详解及@scheduled与多线程和@Async异步任务结合使用
本篇文章主要介绍了Spring Boot @Async 异步任务执行方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
本篇文章主要介绍了spring boot中使用@Async实现异步调用任务,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
在业务处理中,有些业务使用异步的方式更为合理,这篇文章主要介绍了Spring中@Async注解执行异步任务的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Android异步任务下载一张图片,关键是异步任务的流程,带进度条的异步任务
1. SpringBoot 自定义线程池以及多线程间的异步调用(@Async、@EnableAsync) 2.Java多线程之定时任务 以及 SpringBoot多线程实现定时任务 3.@EnableScheduling 与 @Scheduled
一、Async异步任务 在Java应用中绝大多数情况下默认都是通过同步的方式来实现交互处理的 但在处理与第三方系统交互的时候 容易造成响应迟缓的情况 可以使用多线程来完成此类任务 但其实 在Spring 3.x之后 已经内置了...
Spring为任务调度与异步方法执行提供了注解支持。通过在方法上设置@Async注解,可使得方法被异步调用。下面这篇文章主要给大家介绍了关于spring boot异步调用方式@Async的相关资料,需要的朋友可以参考下。
RxJava封装异步任务RxAsyncTask
主要介绍了Spring Boot Async异步执行任务过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
简单的Demo:Spring Boot使用@Async注解实现异步任务。
springboot异步任务案例,通过注解来实现定时器,以及相应的异步任务的执行。
mysql-async 是基于 swoole 开发的 PHP 异步 MySQL 客户端,内置连接池和任务排队机制。基于 mysql-async 可以编写出纯异步、支持超高并发的 PHP 应用。
主要介绍了spring boot使用自定义配置的线程池执行Async异步任务,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
在没有使用spring boot之前,我们的做法是在配置文件中定义一个任务池,然后将@Async注解的任务丢到任务池中去执行,那么在spring boot中,怎么来实现异步任务的调用了,下面通过本文给大家讲解,需要的朋友参考下
使用@Async注解可以将普通的方法异步执行,使其成为一个异步任务。可以在方法上添加@Async注解并配合@EnableAsync注解将其激活。 4.使用第三方库,如Quartz: 除了使用Spring Boot提供的任务管理功能外,可以使用第...
在项目中,当访问其他人的接口较慢或者做耗时任务时,不想程序一直卡在耗时任务上,想程序能够并行执行,我们可以使用多线程来并行的处理任务,也可以使用spring提供的异步处理方式@Async。需要的朋友们下面来一起看...
异步注解代理的方法可以有一个返回值Future,可以用isCancelled判断异步任务是否取消,isDone判断任务是否执行结束,get获取返回结果。 个人看法:我们不使用springboot异步,也可以实现异步,但这时我们自己要建立...
LINQ-Async允许您链接异步任务并使用流畅的API命令异步谓词。 特征 OrderByPredicateCompletion 同时启动Predicate OrderByCompletion 选择结果 下载 PM> Install-Package Z.Linq.Async LINQ异步扩展 问题 您要...
安装使用可以: $ npm install --save-dev gulp-async-tasks用法gulp-async-tasks为gulpfile.js中的所有任务创建异步任务。 异步任务的名称后缀为“:async”。 var gulp = require ( 'gulp-async-tasks' ) ( ...