`
jinnianshilongnian
  • 浏览: 21513944 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2420533
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:3010263
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5640610
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:260226
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1597955
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:250370
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5860620
Group-logo
跟我学Nginx+Lua开...
浏览量:702889
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:785761
社区版块
存档分类
最新评论

如何测试@Async异步任务

阅读更多

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内部提供支持,支持这样异步调用的测试。

2
3
分享到:
评论
2 楼 jinnianshilongnian 2013-07-09  
7454103 写道
引用

1.//移除异步支持  
2.if(AopProxyUtils.isAsync(messageApi)) {  
3.    AopProxyUtils.removeAsync(messageApi);  
4.} 



疑问:这个异步任务是否可能在主线程执行到需要回滚的时候 就已经开始执行了呢(或者执行完成了呢)

在执行异步任务之前执行这句话 就没问题了
1 楼 7454103 2013-07-09  
引用

1.//移除异步支持  
2.if(AopProxyUtils.isAsync(messageApi)) {  
3.    AopProxyUtils.removeAsync(messageApi);  
4.} 



疑问:这个异步任务是否可能在主线程执行到需要回滚的时候 就已经开始执行了呢(或者执行完成了呢)

相关推荐

    @scheduled任务调度使用详解及@scheduled与多线程和@Async异步任务结合使用

    本篇文章将深入讲解`@Scheduled`的使用方法,以及如何将其与多线程和`@Async`异步任务相结合,提升应用程序的效率。 ### `@Scheduled`任务调度 `@Scheduled`是Spring Framework中的一个注解,它允许我们在不需要...

    springboot中@Async异步调用注解的使用

    在Spring Boot框架中,@Async注解是实现异步任务处理的关键工具,它允许开发者将耗时的操作从主线程中分离出来,以提高应用程序的响应速度。本文将深入探讨@Async的工作原理、配置方法以及使用场景,帮助你更好地...

    浅谈Spring @Async异步线程池用法总结

    本文主要介绍了Spring @Async异步线程池的用法总结,包括异步线程池的接口类、@Async定义异步任务、Spring开启异步配置等内容。 1. 异步线程池的接口类 Spring提供了多种异步线程池的接口类,包括TaskExecutor、...

    Spring Boot @Async 异步任务执行方法

    Spring Boot @Async 异步任务执行方法 Spring Boot 框架提供了 @Async 注解来支持异步任务执行,该注解可以将方法调用转换为异步调用,从而提高应用程序的并发能力和响应速度。下面是关于 Spring Boot @Async 异步...

    JAVA 中Spring的@Async用法总结

    之前大部分都是使用多线程来完成此类任务,但是在 Spring 3.x 之后,就已经内置了 @Async 来完美解决这个问题。 异步调用 异步调用是指在发送调用指令后,不等待被调用方法完全执行完毕,而是继续执行下面的流程。...

    Spring Boot利用@Async如何实现异步调用:自定义线程池

    在上面的代码中,我们使用了"taskExecutor"线程池来执行异步任务。 结论 在本文中,我们学习了如何使用@Async注解来实现异步调用,并且了解了如何使用ThreadPoolTaskExecutor类来创建一个自定义的线程池。通过使用...

    Spring Boot利用@Async异步调用:使用Future及定义超时详解

    本文将详细介绍如何使用`@Async`结合`Future`来处理异步任务,并探讨如何定义超时。 `@Async`是Spring提供的一个注解,用于标记一个方法为异步执行。当一个带有`@Async`的方法被调用时,Spring会创建一个新的线程来...

    Spring中@Async注解执行异步任务的方法

    Spring中@Async注解执行异步任务的方法 在业务处理中,有些业务使用异步的方式更为合理。这篇文章主要介绍了Spring中@Async注解执行异步任务的方法。@Async注解是Spring提供的一个annotation,可以将方法异步化,...

    spring boot中使用@Async实现异步调用任务

    接下来,我们将深入探讨如何在Spring Boot中使用`@Async`进行异步任务调用。 首先,我们需要理解同步调用与异步调用的区别。同步调用是一种顺序执行的方式,每一个方法必须等待前一个方法执行完毕后才能继续执行。...

    【java框架】SpringBoot(10) -- SpringBoot巧用 @Async提升API接口并发能力 .pdf

    此外,还可以利用Actuator模块的 `/async`端点监控异步任务的状态和执行时间。 5. **总结** SpringBoot的`@Async`注解提供了一种简洁的手段,用于提升API接口的并发处理能力,通过将原本同步执行的任务转换为异步...

    Springboot启用async异步调用

    因此,我们可以通过配置自定义的`TaskExecutor`来调整异步任务的执行策略,例如使用线程池: ```java @Configuration @EnableAsync public class AppConfig implements AsyncConfigurer { @Override public ...

    springboot中@Async默认线程池导致OOM问题

    在 SpringBoot 中使用 @Async 注解来实现异步操作是一种非常常见的做法,但是如果不小心,可能会导致 OOM(Out of Memory)问题。本文将详细介绍 SpringBoot 中 @Async 默认线程池导致 OOM 问题的原因、解决方法以及...

    Spring中@Async注解实现异步调详解

    要使用@Async注解,需要在配置类中通过@EnableAsync开启对异步任务的支持,并通过在实际执行的Bean的方法中使用@Async注解来声明其是一个异步任务。例如,在下面的代码中,我们使用了@Configuration和@EnableAsync...

    spring boot 使用@Async实现异步调用方法

    为了测试这些异步任务,我们需要创建一个Controller,注入`Task`类的实例,并调用这些异步方法。由于`Task`已经被Spring管理,所以我们使用`@Autowired`注解来注入它。 ```java import org.springframework.beans....

    谈谈SpringBoot中@Async注解使用的一些误区

    使用`@Async`注解并不意味着Spring Boot会自动配置异步任务。你需要在配置类上使用`@EnableAsync`注解或者在Spring Boot的配置文件(application.properties或application.yml)中启用异步处理。例如,在配置类中: ...

    深入理解Spring注解@Async解决异步调用问题

    深入理解Spring注解@Async解决异步调用问题 本文将详细介绍Spring框架中的@Async注解,并深入理解其在解决异步调用问题中的应用。通过示例代码和详细的解释,帮助读者更好地理解@Async的使用和原理。 一、异步调用...

    Spring Boot利用@Async异步调用:ThreadPoolTaskScheduler线程池的优雅关闭详解

    在Spring Boot应用中,使用`@Async`注解可以方便地实现异步任务,而`ThreadPoolTaskScheduler`作为Spring提供的一个任务调度器,允许我们创建一个定制化的线程池来处理这些异步任务。本文将深入探讨如何优雅地关闭`...

    带有@Transactional和@Async的循环依赖问题

    对于异步方法,Spring会在bean初始化时创建一个Executor服务,并将bean的方法调用包装成Future任务提交到Executor中。 现在,让我们回到问题的核心:当一个bean(如`TransationServiceImpl`)中存在循环依赖,并且...

    springboot异步任务案例

    Spring Boot提供了简单易用的API和注解来支持异步任务的实现,特别是通过`@Async`注解和定时任务`@Scheduled`。下面我们将深入探讨这两个核心概念。 ### `@Async` 注解 `@Async`是Spring提供的一个注解,用于标记...

    Spring中@Async用法详解及简单实例

    在Spring框架中,@Async注解用于实现异步方法调用,这是Spring 3.x引入的一个特性,旨在简化多线程编程,提高应用程序的性能和响应速度。在传统的同步调用中,程序会按照顺序执行各个步骤,等待每个方法执行完毕后才...

Global site tag (gtag.js) - Google Analytics