异步任务使用场景
在很多情况下,比如邮件发送,文件上传或者下载的时候,由于时间较长,经常会出现用户需要很长时间才会得到响应,为了优化用户体验,比如先进行页面跳转,显示已经开始进行邮件发送或者下载上传文件等信息,等任务结束再返回成功信息,这就采取了异步的方式进行任务调度。
异步任务的实现
首先我们可以模拟一个网站跳转的过程,假设某一个线程执行某个任务需要3秒,结束以后才会进行下一步,我们令线程休眠三秒,然后通过controller进行页面跳转,代码如下:
Service层
@Service
public class AsyncService {
public void hello(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("数据正在处理");
}
}
Controller层
@RestController
public class AsyncController {
@Autowired
private AsyncService asyncService;
@RequestMapping("/hello")
public String hello(){
asyncService.hello();
return "OK";
}
}
这时用户点击需要等待三秒才会跳转到新页面并显示OK,此时由于用户体验极差,大概率下用户会直接关闭该网页,因此需要通过多线程的方式来实现异步任务调度,而SpringBoot则可以使用更简便的方式来实现异步任务调度。我们只需要在Service层需要多线程处理的方法上加上@Async注解。
@Service
public class AsyncService {
@Async
public void hello(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("数据正在处理");
}
}
然后在主启动类上加上**@EnableAsync**注解来开启异步注解功能即可执行异步任务调度,此时执行可立即跳转然后再执行hello方法来输出“数据正在处理”。
//开启异步注解功能
@EnableAsync
@SpringBootApplication
public class SpringbootTestApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootTestApplication.class, args);
}
}