干货分享-SpringBoot定时器无废话使用入门

SpringBoot中定时器的使用

简介

SpringBoot内置使用Spring task作为定时器,无需额外的操作,直接使用即可。

定时器主要分为两种:

  1. 每隔指定时间执行一次任务;
  2. 例如:应用每隔10分钟去获取最新的天气情况;或者每隔10秒钟,同步一次航班信息;
  3. 在指定的时间执行一次任务;
  4. 例如:应用每天晚上1点钟,生成前一天的销售报表;每天早上9点,发送一次催款短信等;

快速使用

1,在Springboot中启用定时器,需要在启动类上添加@EnableScheduling标签:

干货分享-SpringBoot定时器无废话使用入门

2,任务开发,在需要作为定时任务的方法上,添加@Scheduled标签:

干货分享-SpringBoot定时器无废话使用入门

@Scheduled标签使用

@Scheduled标签提供了非常多属性的配置项,查看@Scheduled标签代码(仅列出重要属性):

干货分享-SpringBoot定时器无废话使用入门

其中:

  • cron:使用cron表达式,完成指定时间执行任务;
  • fixedDelay:上一次任务结束时间点之后X毫秒执行一次任务(一般使用这个);
  • fixedDelayString:允许配置占位符的方式来配置fixedDelay;
  • fixedRate:上一次任务开始时间点之后X毫秒执行一次任务;
  • fixedRateString:允许配置占位符的方式来配置fixedRate;
  • initialDelay:第一次初始化之后延迟X毫秒执行第一次任务;
  • initialDelayString:允许配置占位符的方式来配置initialDelay;

fixedDelay+initialDelay

下面代码演示fixedDelay混合initialDelay的使用方式:

干货分享-SpringBoot定时器无废话使用入门

系统打印:

干货分享-SpringBoot定时器无废话使用入门

cron表达式

一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。按顺序依次为:

  • 秒(0~59)
  • 分钟(0~59)
  • 3 小时(0~23)
  • 4 天(0~31)
  • 5 月(0~11)
  • 6 星期(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
  • 年份(1970-2099)

其中,每个元素可以是一个固定的值或者由特殊符号或者通配符构成;

cron表达式支持一些特殊符号和通配符:

  • “*”字符代表所有可能的值
  • “/”字符用来指定数值的增量
  • “-”字符用来表示连续的区间
  • "L"字符用在日/星期,代表Last(最后);

一些例子:

  • */5 ** * * ?:每隔5秒执行一次
  • 0 */1 ** * ?:每隔1分钟执行一次
  • 0 0 10,14,16 * * ? :每天上午10点,下午2点,4点
  • 0 0 12 * * ?:每天中午12点触发
  • 0 15 10 ? * *:每天上午10:15触发
  • 0 * 14 * * ?:每天下午2点到下午2:59期间的每1分钟触发
  • 0 0/5 14 * * ?:每天下午2点到下午2:55期间的每5分钟触发
  • 0 15 10 L * ?:每月最后一日的上午10:15触发

一个使用cron表达式的代码示例

干货分享-SpringBoot定时器无废话使用入门

运行结果:

干货分享-SpringBoot定时器无废话使用入门

串行执行和并行执行

默认情况下,多任务是单线程串行执行的,适合简单快速的任务。

比如,同时运行上面两个任务(CronTask和SimpleTask),运行结果为:

干货分享-SpringBoot定时器无废话使用入门

可以看到,两个任务同时运行在pool-2-thread-1这个线程上;

在Springboot中,要开启并行执行的任务,很简单,只需要配置一个线程池供任务调度器使用即可:

干货分享-SpringBoot定时器无废话使用入门

在该代码中,我们创建了一个3个子线程的线程池供任务调度器使用;

再次运行两个任务,执行结果:

干货分享-SpringBoot定时器无废话使用入门

可以很明显的看到,分别使用了pool-2-thread-1,pool-2-thread-2,pool-2-thread-3三个线程执行。


分享到:


相關文章: