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..."); } }
未完待续...
原文地址:https://www.cnblogs.com/wangxiayun/p/10298235.html