媒介
上两章节,我们简朴的讲授了关于异法式用和异步请求相关常识点。这一章节,我们来讲讲开拓进程也是常常会遇见的按时任务。好比天天按时清理无效数据、按时发送短信、按时发送邮件、付出系统中的按时对账等等,往往城市界说一些按时器,举办此业务的开拓。所以,本章节先容下在
SpringBoot
中按时任务如何利用及一点漫衍式按时处事的思考总结。
一点常识
在JAVA
开拓规模,今朝可以通过以下几种方法举办按时任务:
Spring
提供的一个任务调治东西,支持注解和设置文件形式,支持Cron
表达式,利用简朴但成果强大。题外话:对付Quartz
,早前用过1.6版本的,更新到2.x及以上版本后根基没怎么打仗了,本来尚有倒腾过团结Kettle
做了一些动态的按时抽取数据啥的还编写过一个Cron
表达式编辑器,此刻根基健忘了。。等有时机,再次深入进修后再来单独分享一些关于的Quartz
心得吧。
基于JDK方法实现简朴按时
方才有先容过,基于JDK
方法一共有两种:Timer
和ScheduledExecutorService
。接下来,就简朴讲授下这两种方法。
Timer
Timer
是jdk提供的java.util.Timer
类。
简朴示例:
@GetMapping("/timer") public String doTimer() { Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { log.info("Timer按时任务启动:" + new Date()); } }, 1000,1000);//延迟1秒启动,每1秒执行一次 return "timer";
启动后,会见即可瞥见节制台周期性输出信息了:
2018-08-18 21:30:35.171 INFO 13352 --- [ Timer-0] c.l.l.s.c.controller.TaskController : Timer按时任务启动:Sat Aug 18 21:30:35 CST 2018 2018-08-18 21:30:36.173 INFO 13352 --- [ Timer-0] c.l.l.s.c.controller.TaskController : Timer按时任务启动:Sat Aug 18 21:30:36 CST 2018 2018-08-18 21:30:37.173 INFO 13352 --- [ Timer-0] c.l.l.s.c.controller.TaskController : Timer按时任务启动:Sat Aug 18 21:30:37 CST 2018 2018-08-18 21:30:38.173 INFO 13352 --- [ Timer-0] c.l.l.s.c.controller.TaskController : Timer按时任务启动:Sat Aug 18 21:30:38 CST 2018 2018-08-18 21:30:39.174 INFO 13352 --- [ Timer-0] c.l.l.s.c.controller.TaskController : Timer按时任务启动:Sat Aug 18 21:30:39 CST 2018 ......
相关API简朴说明:
1、在特按时间执行任务,只执行一次
public void schedule(TimerTask task,Date time)
2、在特按时间之后执行任务,只执行一次
public void schedule(TimerTask task,long delay)
3、指定第一次执行的时间,然后凭据隔断时间,反复执行
public void schedule(TimerTask task,Date firstTime,long period)
4、在特定延迟之后第一次执行,然后凭据隔断时间,反复执行
public void schedule(TimerTask task,long delay,long period)
5、第一次执行之后,特定频率执行,与3同
public void scheduleAtFixedRate(TimerTask task,Date firstTime,long period)
6、在delay毫秒之后第一次执行,后凭据特定频率执行
public void scheduleAtFixedRate(TimerTask task,long delay,long period)
参数:
打消任务利用:timer.cancel()
要领即可注销任务。
此类相对用的较少了,简朴相识下。
ScheduledExecutorService
ScheduledExecutorService
可以说是Timer
的替代类,因为Timer
不支持多线程,任务是串行的,并且也不捕捉异常,假设某个任务异常了,整个Timer
就无法运行了。