在开发工作中,开发者会经常遇到要使用异步处理的任务,例如发邮件,这个过程会耗费不少时间,如果正常执行,那么后台发送邮件时,前台就会造成响应不动,直到邮件发送完毕。所以一般都是使用多线程去处理这些问题,但是每次需要开启多线程太麻烦了,所以springboot就有了异步任务。在springBoot使用异步任务非常简单,只需要两步便能轻松使用。
前期准备工作:
1、准备一个service(AsynService),编写方法,模拟正在处理数据,例如使用线程休眠制造出同步时的等待效果。
@Service
public class AsynService {
public void asyn() {
System.out.println("任务正在处理中……");
try {
Thread.sleep(5000);//线程休眠5s
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("任务处理完成");
}
}
2、准备一个controller(AsynController),编写方法,调用service中模拟正在处理数据的方法。
@Controller
public class AsynController {
@Resource
private AsynService asynService;
@GetMapping("/asyn")
@ResponseBody
public String asyn(){
asynService.asyn();
return "OK";
}
}
3、测试。此时,业务方法以及调用就好了,访问http://8080/asyn测试,页面就会出现5秒的加载等待,这就是同步时等待的情况。
使用异步任务:原基础代码变,添加@EnableAsync
和@Async
两个注解即可。
1、在启动类中添加@EnableAsync
注解,开启异步任务功能
@EnableAsync //开启异步注解功能。这是重点!!!重点!!!重点!!!
@SpringBootApplication
public class Ch08SpringbootTaskApplication {
public static void main(String[] args) {
SpringApplication.run(Ch08SpringbootTaskApplication.class, args);
}
}
2、在需要开启异步的方法上添加@Async
注解,告诉spring这是一个异步方法,springboot就会自己开启一个线程池进行调用,但是需要这个注解生效就必须在主程序上添加@EnableAsync
注解。
@Async //告诉spring这是一个异步方法,只多了这一句代码
public void asyn() {
System.out.println("任务正在处理中……");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("任务处理完成");
}