SpringBoot精选

SpringBoot定时任务小Demo,及Scheduled相关

2020-04-28  本文已影响0人  程就人生

前言

在实际开发中,定时任务是很常见的功能,那么在SpringBoot是如何实现定时任务的呢?使用起来难不难呢?还需要不要引入格外的架包呢?想必在写定时任务之前,心中肯定存在这些疑惑,现在就来一一说明。

SpringBoot内置了定时任务Scheduled,通过@Scheduled注解就能实现定时任务;当然,还需要在启动类上增加@EnableScheduling来启动定时任务。是的,在SpringBoot里面实现定时任务就是如此简单!下面就看个Demo吧。

首先,在启动类上增加@EnableScheduling注解,来启动定时任务。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

/**
 * 添加@EnableScheduling注解启动定时任务
 * @author 程就人生
 * @date 2020年4月28日
 */
@SpringBootApplication
@EnableScheduling
public class SpringbootQuartzDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootQuartzDemoApplication.class, args);
    }

}

第二,开始编写定时任务类,在方法上添加注解或表达式说明定时执行时间;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * 定时任务执行
 * @author 程就人生
 * @date 2020年4月28日
 */
@Component
public class ScheduledTask {

    /**
     * corn表达式
     * 0/1 * * * * ? 一秒执行一次
     */
   //@Scheduled(cron = "0/1 * * * * ?") //一秒执行一次
   //@Scheduled(cron = "*/5 * * * * ?")  //每隔5秒执行一次
  @Scheduled(cron = "0 */1 * * * ?") //每隔1分钟执行一次
    public void scheduledTask1(){
        System.out.println("定时任务1");
    }

    /**
     * initialDelay:启动后多久开始执行,单位时毫秒
     * fixedDelay:下次执行时间,fixedDelay等任务进行完了才开始计时
     */
    @Scheduled(initialDelay =  1000 * 10,fixedDelay = 1000 * 5)
    public void scheduledTask2(){
        System.out.println("任务2执行时间:"+System.currentTimeMillis());
        System.out.println("定时任务2");
        try {
            Thread.sleep(2*1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("任务2结束时间:"+System.currentTimeMillis());
    }

    /**
     * initialDelay:启动后多久开始执行,单位时毫秒
     * fixedRate:下次执行时间,任务开始运行的时候就计时
     */
    @Scheduled(initialDelay =  1000 * 10,fixedRate = 1000 * 5)
    public void scheduledTask3(){
        System.out.println("任务3执行时间:"+System.currentTimeMillis());
        System.out.println("定时任务3");
        try {
            Thread.sleep(2*1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("任务3结束时间:"+System.currentTimeMillis());
    }
}

最后,启动项目,查看运行结果:

运行结果

定时任务的难点,就在于Cron表达式的配置,弄懂了Cron表达式的规则就不怕看不懂了。

Cron表达式

Cron表达式是一串有规律可循的字符串,每个字段之间用空格隔开,共有5到6个空格,分为6或7个域,每一个域代表一个含义,Cron表达式有两种语法格式:
(1)Seconds Minutes Hours DayofMonth Month DayofWeek Year
(2)Seconds Minutes Hours DayofMonth Month DayofWeek
一、结构
  Corn从左到右(用空格隔开):秒 分 小时 月份中的天 月份 星期中的天 年份
二、各字段的含义

字段 允许值 允许的特殊字符
秒(Seconds) 0~59的整数 , - * /
分(Minutes) 0~59的整数 , - * /
小时(Hours) 0~23的整数 , - * /
日期(DayofMonth) 1~31的整数 ,- * ? /LWC
月份(Month) 1~12的整数(JAN-DEC) , - * /
星期(DayofWeek) 1~7的整数( SUN-SAT) , - * ? / LC#
年(可选,留空)(Year) 1970~2099 , - * /

星期的可选参数:“MON-FRI”,“MON,WED,FRI”,“MON-WED,SAT”等等。

特殊字符的含义
每一个域都可以使用数字,也可以使用特殊字符,特殊字符的含义如下:
*:表示匹配该域的任意值。在Minutes域使用*,即表示每分钟都会触发事件。
?:只能用在DayofMonth和DayofWeek两个域。
-:表示范围。例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次
/:表示起始时间开始触发,然后每隔固定时间触发一次。在Minutes域使用5/20,则意味着5分钟触发一次。
,:表示列出枚举值。例如:在Minutes域使用5,20,则意味着在5和20分每分钟触发一次。
L:表示最后,只能出现在DayofWeek和DayofMonth域。如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。
W:表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。例如:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份 。
LW:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。
#:用于确定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2,表示某月的第二个星期三。

三、常用表达式例子

表达式 含义
0 0 2 1 * ? * 每月1日的两点执行任务;
0 15 10 ? * MON-FRI 周一到周五每天上午10:15执行任务;
0 15 10 ? 6L 2002-2006 2002-2006年的每个月的最后一个星期五上午10:15执行任务;
0 0 10,14,16 * * ? 每天上午10点,下午2点,4点 ;
0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时 ;
0 0 12 ? * WED 表示每个星期三中午12点 ;
0 0 12 * * ? 每天中午12点触发 ;
0 15 10 ? * * 每天上午10:15触发 ;
0 15 10 * * ? 每天上午10:15触发 ;
0 15 10 * * ? * 每天上午10:15触发 ;
0 15 10 * * ? 2005 2005年的每天上午10:15触发 ;
0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发 ;
0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发 ;
0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 ;
0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发 ;
0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发 ;
0 15 10 ? * MON-FRI 周一至周五的上午10:15触发 ;
0 15 10 15 * ? 每月15日上午10:15触发 ;
0 15 10 L * ? 每月最后一日的上午10:15触发 ;
0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发 ;
0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发 ;
0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发 ;

有了这些Cron表达式配置详解,写定时任务是不是简单多了~!
参考资料:
https://blog.csdn.net/qq_27520051/article/details/90581343
https://www.cnblogs.com/javahr/p/8318728.html

上一篇下一篇

猜你喜欢

热点阅读