使用@Scheduled实现定时任务

2022-10-31 07:55:19

@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自带的类,使用简单,
缺点:是该方案仅适用于单机环境。

详情可见Java 定时任务-最简单的3种实现方法

  • 作者:Silver gradient
  • 原文链接:https://blog.csdn.net/z19950712/article/details/125333632
    更新时间:2022-10-31 07:55:19