Java 的任务在项目中需要用到的地方很多, 比如, 每月月末的财务报表给财务部门, 定时给领导发个邮件短信等等. 这时候我们就需要用到任务了, 任务调度本身涉及到多线程并发, 运行时间规则制定和解析, 场景保持与恢复, 线程池维护等诸多方面的工作. 之前的学习中也使用过任务的框架 Quartz, 用起来也十分地编辑. 本篇文章主要讲的是 SpringBoot 中基于注解的任务调度的简单使用.
一. 异步任务
正常情况下, 同一线程中的方法是同步执行的, 比如我要请求一段数据, 但是这个数据等待 service 层执行 3s 之后, 然后才能返回给我, 而且这个 service 层与我想到得到的数据没有丝毫关系. 如果想要不等待 service 层处理数据的话, 只能开启一个线程去执行 service 层方法, 然后另外一个线程直接返回数据给我. 但是这样做的话会变得很麻烦, 所以我们可以使用异步任务的方式, 就可以实现我上面的需求.
1.1 开启异步任务注解
- @SpringBootApplication
- @EnableAsync // 开启异步注解
- public class Springboot04TaskApplication {
- public static void main(String[] args) {
- SpringApplication.run(Springboot04TaskApplication.class, args);
- }
- }
1.2 异步任务执行方法
- @Service
- public class AsyncService {
- @Async
- public void hello(){
- try {
- Thread.sleep(3000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println("处理数据中");
- }
- }
1.3 异步任务测试
- @Controller
- public class AsyncController {
- @Autowired
- AsyncService asyncService;
- @GetMapping("/hello")
- @ResponseBody
- public String hello(){
- asyncService.hello();
- return "success";
- }
- }
运行项目, 访问 "/hello" 请求, 若页面没有经过等待直接返回 "success" 数据, 经过 3s 之后控制台打印了 "处理数据中" 说明该异步任务执行成功.
二. 定时任务
定时任务的使用方式和异步任务的差不多. 不过需要注意的是定时任务的 core 表达式.
2.1 core 表达式
例如:
@Scheduled(cron = "0 * * * * MON-SAT") 每分钟的整秒的时候执行该方法
@Scheduled(cron = "0,1,2,3,4 * * * * MON-SAT") 每分钟 0,1,3,4 秒的的时候执行该方法
@Scheduled(cron = "0-4 * * * * MON-SAT") 每分钟 0,1,3,4 秒的的时候执行该方法
@Scheduled(cron = "0/4 * * * * MON-SAT") 每四秒执行一次 (/ 设定步长)
@Scheduled(cron = "0 0 2-4 ? * 1#1") 每个月的第一个周一凌晨 2 点到 4 点期间, 每个整点都执行一次
2.2 定时任务使用
- @EnableScheduling // 开启定时任务注解
- @SpringBootApplication
- public class Springboot04TaskApplication {
- public static void main(String[] args) {
- SpringApplication.run(Springboot04TaskApplication.class, args);
- }
- }
- @Service
- public class ScheduledService {
- /**
- * second,minute,hour,day of month,month,day of week
- * 0 * * * * MON-FRI
- */
- @Scheduled(cron = "0/4 * * * * MON-SAT") // 每四秒执行一次 (/ 设定步长)
- public void say(){
- System.out.println("Hello...");
- }
- }
未完待续...
来源: http://www.bubuko.com/infodetail-2928822.html