1. 异步任务的使用场景
异步任务是相对于同步任务来讲,同步任务就是顺序执行的任务,前面的任务没有执行完,后面的任务只能等待,而异步任务不同,它可以多个任务并行执行,异步任务有很多优点:
(1)减少主流程执行时间,避免主业务被长时间阻塞,提升服务器处理请求的并量
(2)避免因为一个辅助功能的处理失败而导致整个请求失败
比如,用户下单之后,可能系统会赠送一些积分之类的,赠送积分并不是主要流程,整个过程可以放到异步任务或者消息队列中去完成,异步任务还适用于处理log、发送邮件、短信等
2. springboot异步任务如何使用
- 启动类里面使用@EnableAsync注解开启功能,自动扫描
- 定义异步任务类并使用@Component标记组件被容器扫描,异步方法加上@Async,需要注意以下几点:
* 要把异步任务封装到类里面,不能直接写到Controller
* 增加Future 返回结果 AsyncResult(“task执行完成”);
* 如果需要拿到结果 需要判断全部的 task.isDone() - 通过注入方式,注入到controller里面
2.1 不带返回值的异步任务
- 定义异步任务类,分别定义三个异步任务方法,方法中分别睡眠1s, 2s, 4s
package com.example.springbootdemo4.service;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
/**
* 异步任务类,注意点:不能直接写到Controller里
*/
@Component
public class AsyncTask {
/**
* 异步任务1, @Async把该方法标记为一个异步方法,或者把方法上的注解挪到类上面也可以!
* @throws InterruptedException
*/
@Async
public void asyncTask1() throws InterruptedException {
long begin = System.currentTimeMillis();
Thread.sleep(1000);
long end = System.currentTimeMillis();
System.out.println("任务1耗时:" + (end-begin)) ;
}
@Async
public void asyncTask2() throws InterruptedException {
long begin = System.currentTimeMillis();
Thread.sleep(2000);
long end = System.currentTimeMillis();
System.out.println("任务2耗时:" + (end-begin)) ;
}
@Async
public void asyncTask3() throws InterruptedException {
long begin = System