定时任务的基本使用

在springboot中使用@EnableScheduling@Scheduled注解启用定时任务

新建springboot项目

添加@EnableScheduling注解

  • 可以在 Application 中添加
  @SpringBootApplication
  @EnableScheduling
  public class TestApplication {
      public static void main(String[] args) {
          SpringApplication.run(TestApplication.class, args);
      }
  }
  • 也可以直接在定时任务上添加
   @Component
   @EnableScheduling
   public class TestTimer {
       @Scheduled(fixedDelay = 1000)
       public void sayHello(){
           System.out.println("hello");
       }
       @Scheduled(cron = "0/30 * * * * ?")
       public void sayWhy(){
           System.out.println("Why");
       }
   }
  • 当然可以使用一个配置类
   @Configuration
   @EnableScheduling
   public class TimerConfig {
   }

新建任务类,添加@Component注解

  • 在方法添加@Scheduled注解,设定时间
  @Component
  public class TestTimer {
      @Scheduled(fixedDelay = 1000)
      public void sayHello(){
          System.out.println("一秒说一次===>hello");
      }
      @Scheduled(cron = "0/30 * * * * ?")
      public void sayWhy(){
          System.out.println("从0秒开始,每30秒打印一次:Why");
      }
  }

也可以直接在任务类上加@EnableScheduling

@Component
@EnableScheduling
public class TestTimer {
    @Scheduled(fixedDelay = 1000)
    public void sayHello(){
        System.out.println("一秒说一次===>hello");
    }
    @Scheduled(cron = "0/30 * * * * ?")
    public void sayWhy(){
        System.out.println("从0秒开始,每30秒打印一次:Why");
    }
}

这样其他地方就不用配置了

关于cron表达式

就是上面的@Scheduled(cron = "0/30 * * * * ?")中的表达式

按顺序为:

秒(0~59) 
分钟(0~59) 
小时(0~23) 
天(月)(0~31,但是你需要考虑你月的天数)
月(0~11) 
天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT) 
年份(1970-2099) 

特殊字符

特殊字符含义示例
*所有可能的值。在域月中,*表示每个月;在域星期中,*表示星期的每一天。
,列出枚举值。在域分中,5,20表示在分别在5分钟和20分钟触发一次。
-范围。在域分中,5-20表示从5分钟到20分钟之间每隔一分钟触发一次。
/指定数值的增量。在域分钟中,0/15表示从第0分钟开始,每15分钟。在域分钟中3/20表示从第3分钟开始,每20分钟。
?不指定值,仅域日期和星期支持该字符。当域日期或者星期其中之一被指定了值以后,为了避免冲突,需要将另一个域的值设为?
L单词Last的首字母,表示最后一天,仅域日期和星期支持该字符。说明 指定L字符时,避免指定列表或者范围,否则,会导致逻辑问题。在域日期中,L表示某个月的最后一天。在域星期中,L表示一个星期的最后一天,也就是星期六(SAT)。如果在L前有具体的内容,例如,在域星期中的6L表示这个月的最后一个星期五。
W除周末以外的有效工作日,在离指定日期的最近的有效工作日触发事件。W字符寻找最近有效工作日时不会跨过当前月份,连用字符LW时表示为指定月份的最后一个工作日。在域日期中5W,如果5日是星期六,则将在最近的工作日星期五,即4日触发。如果5日是星期天,则将在最近的工作日星期一,即6日触发;如果5日在星期一到星期五中的一天,则就在5日触发。
#确定每个月第几个星期几,仅域星期支持该字符。在域星期中,4#2表示某月的第二个星期三。

遥望漉雪千山都过尽,隔海隔山你的背影。