@Scheduled注解
@Scheduled注解是spring boot提供的用于定时任务控制的注解,主要用于控制任务在某个指定时间执行,或者每隔一段时间执行.配置@Scheduled主要有三种配置执行时间的方式(cron/fixedRate/fixedDelay
)。它的配置一共有8个参数,需要配合@EnableScheduling
注解使用(在启动类上,声明@EnableScheduling
,表示开启定时任务)。
cron表达式
该参数接收一个cron表达式,cron表达式是一个字符串,字符串以5或6个空格隔开,分开共6或7个域,每一个域代表一个含义。
语法:
[秒] [分] [小时] [日] [月] [周] [年]
常用通配符说明*
:表示所有值。 例如:在分的字段上设置 *,表示每一分钟都会触发。?
:表示不指定值。使用的场景为不需要关心当前设置这个字段的值。例如:要在每月的10号触发一个操作,但不关心是周几,所以需要周位置的那个字段设置为”?” 具体设置为 0 0 0 10 * ?
注:[年]不是必须的域,可以省略[年],则一共6个域
例如:@Scheduled(cron = "0 0 1 * * ?")
// 每天凌晨一点各执行一次(使用的时候直接放在定时任务方法上即可)
fixedRate
该配置表示上一次执行时间后距离多长时间再执行;
例如:
@Scheduled(fixedRate=5000)//上一次开始执行时间点之后5秒再执行@Scheduled(fixedRate=1000*10)//10秒发送一次
与cron表达式区别:该配置在实际使用中(本地配置后),重启tomcat即可生效;而cron表达式只能等到约定时间后才能生效;
fixedDelay
上一次执行完毕时间点之后多长时间再执行。
@Scheduled(fixedDelay=5000)
详细可看这个贴子Spring中定时任务@Schedule注解的使用
实现定时任务的其他方式
1、Timer
实现如下:
publicclassMyTimerTask{publicstaticvoidmain(String[] args){// 定义一个任务TimerTask timerTask=newTimerTask(){@Overridepublicvoidrun(){System.out.println("打印当前时间:"+newDate());}};// 计时器Timer timer=newTimer();// 开始执行任务 (延迟1000毫秒执行,每3000毫秒执行一次)
timer.schedule(timerTask,1000,3000);}}
优点: 使用简单;
缺点: 前面任务的执行用时和异常会影响到后面任务;
2、ScheduledExecutorService
ScheduledExecutorService 也是Java自带的类,它可以实现Timer具备的所有功能,并解决了 Timer类存在的问题。
实现如下:
publicclassMyScheduledExecutorService{publicstaticvoidmain(String[] args){// 创建任务队列 10 为线程数量ScheduledExecutorService scheduledExecutorService=Executors.newScheduledThreadPool(10);// 执行任务
scheduledExecutorService.scheduleAtFixedRate(()->{System.out.println("打印当前时间:"+newDate());},1,3,TimeUnit.SECONDS);// 1s 后开始执行,每 3s 执行一次}}
ScheduledExecutorService 优缺点分析
优点是:该类是JDK1.5自带的类,使用简单,
缺点:是该方案仅适用于单机环境。