@Async异步任务

本文介绍了如何使用@Async注解实现Spring中的异步任务,以改善用户在执行耗时操作如发送邮件时的体验。通过示例展示了在不使用异步任务时,用户需要等待任务完成,而在启用@Async后,程序会立即返回,提高系统响应速度。同时,文中列举了可能导致@Async注解失效的几个关键点,帮助开发者避免常见问题。
摘要由CSDN通过智能技术生成

@Async异步任务

在日常项目中经常会遇到一些耗时的附加功能,不影响程序主功能。比如说:发送邮件,下载Excel任务之类;如果需要用户在界面等待当前功能执行结束才能继续做接下来的操作,体验感时绝对很差的,这个时候,就需要开启异步任务,让用户无感知的进行操作。

模拟不使用异步任务

  1. 控制器代码
//test控制器
@RequestMapping("/user")
@RestController
@ResponseBody
public class Controller {

    @Autowired
    TestService testService;

    public void test(){
        System.out.println("进入test控制器。。。");
       testService.test();
        System.out.println("test控制器执行结束");
    }
}
  1. service层测试代码
@Service
public class TestService {
    public void test(){
        try {
            Thread.sleep(3000);			//模拟功能需要执行3s时间
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("执行test方法");
    }
}

  1. 执行结果:
    在这里插入图片描述

这种方式,拿发送邮件功能举例,从用户的角度看,必须要邮件发送成功后才能做接下来的操作,这种等待过程肯定是不友好的。。。

@Async异步

  1. 方法上加异步调用注解
    @Async   //表明这是个异步调用的任务
    public void test(){
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("执行test方法");
    }
  1. 启动类开启异步任务
@SpringBootApplication
@EnableAsync//开启异步执行任务
public class InterceptorApplication {
    public static void main(String[] args) {
        SpringApplication.run(InterceptorApplication.class, args);
    }
}

  1. 执行结果
    在这里插入图片描述

运行发现,程序并没有等待test方法执行,而是开启异步任务执行test。

注意点

以下情况会导致@Async注解失效:

  1. 异步方法使用 static 修饰;
  2. 异步类没有使用 @Component 注解(或其他注解)导致 Spring 无法扫描到异步类;
  3. 异步方法不能与被调用的异步方法在同一个类中;
  4. 类中需要使用 @Autowired 或 @Resource 等注解自动注入,不能手动 new 对象;
  5. 如果使用 Spring Boot 框架必须在启动类中增加 @EnableAsync 注解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值