当前位置:   article > 正文

Spring定时任务常用Cron表达式_spring cron表达式

spring cron表达式

目录

一、SpringBoot定时任务

定时任务概述

创建定时任务

代码开启定时任务

执行结果 (单线程)

多线程处理定时任务

执行结果(并发)

二、Cron详解

Cron表达式是什么

Cron表达式的结构

每个域可出现的字符类型和各字符的含义

各域支持的字符类型

特殊字符含义

表达式例子

举例详解


一、SpringBoot定时任务

定时任务概述

    后台项目开发中经常会用到定时任务,现在实现定时任务都方式也是多种多样。下面列举几种常见的定时任务实现方式:

    1. Quartz:Quartz的使用相当广泛,它是一个功能强大的调度器,当然使用起来也相对麻烦;

    2. java.util包里的Timer,它也可以实现定时任务但是功能过于单一所有使用很少。

    3. 今天要介绍的是Spring自带的定时任务Schedule,其实可以把它看作是一个简化版的,轻量级的Quartz,使用起来也相对方便很多。

创建定时任务

  1. import org.slf4j.Logger;
  2. import org.slf4j.LoggerFactory;
  3. import org.springframework.scheduling.annotation.Scheduled;
  4. import org.springframework.stereotype.Component;
  5. /**
  6. * Description: 构建执行定时任务
  7. * Designer: jack
  8. * Date: 2017/8/10
  9. * Version: 1.0.0
  10. */
  11. @Component
  12. public class ScheduledTasks {
  13. private Logger logger = LoggerFactory.getLogger(ScheduledTasks.class);
  14. private int fixedDelayCount = 1;
  15. private int fixedRateCount = 1;
  16. private int initialDelayCount = 1;
  17. private int cronCount = 1;
  18. @Scheduled(fixedDelay = 5000) //fixedDelay = 5000表示当前方法执行完毕5000ms后,Spring scheduling会再次调用该方法
  19. public void testFixDelay() {
  20. logger.info("===fixedDelay: 第{}次执行方法", fixedDelayCount++);
  21. }
  22. @Scheduled(fixedRate = 5000) //fixedRate = 5000表示当前方法开始执行5000ms后,Spring scheduling会再次调用该方法
  23. public void testFixedRate() {
  24. logger.info("===fixedRate: 第{}次执行方法", fixedRateCount++);
  25. }
  26. @Scheduled(initialDelay = 1000, fixedRate = 5000) //initialDelay = 1000表示延迟1000ms执行第一次任务
  27. public void testInitialDelay() {
  28. logger.info("===initialDelay: 第{}次执行方法", initialDelayCount++);
  29. }
  30. @Scheduled(cron = "0 0/1 * * * ?") //cron接受cron表达式,根据cron表达式确定定时规则
  31. public void testCron() {
  32. logger.info("===initialDelay: 第{}次执行方法", cronCount++);
  33. }
  34. }

使用@Scheduled来创建定时任务 这个注解用来标注一个定时任务方法。通过看@Scheduled源码可以看出它支持多种参数:

    (1)cron:cron表达式,指定任务在特定时间执行;

    (2)fixedDelay:表示上一次任务执行完成后多久再次执行,参数类型为long,单位ms;

    (3)fixedDelayString:与fixedDelay含义一样,只是参数类型变为String;

    (4)fixedRate:表示按一定的频率执行任务,参数类型为long,单位ms;

    (5)fixedRateString: 与fixedRate的含义一样,只是将参数类型变为String;

    (6)initialDelay:表示延迟多久再第一次执行任务,参数类型为long,单位ms;

    (7)initialDelayString:与initialDelay的含义一样,只是将参数类型变为String;

    (8)zone:时区,默认为当前时区,一般没有用到。

代码开启定时任务

  1. import org.springframework.boot.SpringApplication;
  2. import org.springframework.boot.autoconfigure.SpringBootApplication;
  3. import org.springframework.scheduling.annotation.EnableScheduling;
  4. /**
  5. * Description: 启动类
  6. * Designer: jack
  7. * Date: 2017/8/10
  8. * Version: 1.0.0
  9. */
  10. @SpringBootApplication
  11. @EnableScheduling
  12. public class Application {
  13. public static void main(String[] args) {
  14. SpringApplication.run(Application.class, args);
  15. }
  16. }

注意这里的 @EnableScheduling 注解,它的作用是发现注解@Scheduled的任务并由后台执行。没有它的话将无法执行定时任务

执行结果 (单线程)

到此我们就完成了一个简单的定时任务模型,下面执行springBoot观察执行结果。

  1. 2017-08-11 12:06:19.738 INFO 52252 --- [pool-1-thread-1] com.test.ScheduledTasks : ===initialDelay: 第1次执行方法
  2. 2017-08-11 12:06:23.739 INFO 52252 --- [pool-1-thread-1] com.test.ScheduledTasks : ===fixedRate: 第2次执行方法
  3. 2017-08-11 12:06:23.739 INFO 52252 --- [pool-1-thread-1] com.test.ScheduledTasks : ===fixedDelay: 第2次执行方法
  4. 2017-08-11 12:06:24.738 INFO 52252 --- [pool-1-thread-1] com.test.ScheduledTasks : ===initialDelay: 第2次执行方法
  5. 2017-08-11 12:06:28.739 INFO 52252 --- [pool-1-thread-1] com.test.ScheduledTasks : ===fixedRate: 第3次执行方法
  6. 2017-08-11 12:06:28.740 INFO 52252 --- [pool-1-thread-1] com.test.ScheduledTasks : ===fixedDelay: 第3次执行方法
  7. 2017-08-11 12:06:29.739 INFO 52252 --- [pool-1-thread-1] com.test.ScheduledTasks : ===initialDelay: 第3次执行方法
  8. 2017-08-11 12:06:33.735 INFO 52252 --- [pool-1-thread-1] com.test.ScheduledTasks : ===fixedRate: 第4次执行方法
  9. 2017-08-11 12:06:33.741 INFO 52252 --- [pool-1-thread-1] com.test.ScheduledTasks : ===fixedDelay: 第4次执行方法
  10. 2017-08-11 12:06:34.738 INFO 52252 --- [pool-1-thread-1] com.test.ScheduledTasks : ===initialDelay: 第4次执行方法

从控制台输入的结果中我们可以看出所有的定时任务都是在同一个线程池用同一个线程来处理的,那么我们如何来并发的处理各定时任务呢?⬇⬇⬇⬇

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/52497
推荐阅读
相关标签