Spring Boot定时任务

前提:最近写的项目中用到了Spring Boot定时任务,于是查询了一下Spring Boot的定时任务,综合网上学习来的和自己总结的,现做个学习总结,一遍以后用到的时候使用。

1.Spring Boot定时任务用到的标签

@EnableScheduling:开启对定时任务的支持

@Component:将自定义类交给Spring管理(或者将类实例化到Spring容器当中)

@Scheduled:定时任务,具体参数可参考官方文档(https://www.baeldung.com/spring-scheduled-tasks),本文章采用corn表达式

2.搭建Spring Boot环境,实现一个简单的定时任务

    1)idea搭建Spring Boot环境,超级简单,简单的四步

        第一步:File-->new-->Project,进入到下图的这个页面,悬着Spring Initializr,选择自己的JDK(据说JDK11要收费了,不知道真假),然后点击next进入到第二步

Spring Boot定时任务

       第二步:这一步填写自己的Group和Artifact其他默认,然后点击next,进入下一步

Spring Boot定时任务

        第三步:咱们以Web项目为例,所以选择Web加入到工程当中,点击next,进入最后一步

Spring Boot定时任务

         第四步:只要第二步中名字改了,那这一步可以直接点击Finish,当然了,如果要把工程创建到其他地方,那就选择Project location选择你的工作区间,这个时候就会自动创建一个Spring Boot Maven Web项目了

Spring Boot定时任务

    2)环境搭建好了之后,咱们步入正题

        第一步:开启SpringBoot定时任务,在Main类或者系统自动生成的Main类(名称可能不是Main)中,加入第一个注解@EnableScheduling

@SpringBootApplication
@EnableScheduling     //这个是开启定时任务的注解
public class SpringbootScheduleApplication {

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

        第二步:创建定时任务类,将该类交给Spring管控,也就是第二个注解@Component

@Component  //将SchedulingConfig交给Spring管理
public class SchedulingConfig {
    
}

        第三步:最后呢就是重点了,实现定时任务,咱们这里用到了corn表达式,大家可以去自行百度了解一下corn表达式,这里咱们简单介绍一下corn表达式的使用,具体的使用咱们来看下代码:

@Component
public class SchedulingConfig {

    //    corn表达式7个参数
    //第一个:秒     0~59的整数                     , - * /            四个字符
    //第二个:分     0~59的整数                     , - * /            四个字符
    //第三个:时     0~23的整数                     , - * /            四个字符
    //第四个:日     1~31的整数(需要考虑月天数)   , - * ? / L W C    八个字符
    //第五个:月     1~12的整数或者 JAN-DEC         , - * /            四个字符
    //第六个:星期   1~7的整数或者 SUN-SAT (1=SUN), - * ? / L C #    八个字符
    //第七个:年(可选,留空)1970~2099               , - * /            四个字符
    /**
     *(1)*:表示匹配该域的任意值。假如在Minutes域使用*, 即表示每分钟都会触发事件。
     *(2)?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。
              因为DayofMonth和DayofWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,
              则只能使用如下写法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用*,如果使用*表示不管星期几都会触发,实际上并不是这样。
     *(3)-:表示范围。例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次
     *(4)/:表示起始时间开始触发,然后每隔固定时间触发一次。例如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次.
     *(5),:表示列出枚举值。例如:在Minutes域使用5,20,则意味着在5和20分每分钟触发一次。
     *(6)L:表示最后,只能出现在DayofWeek和DayofMonth域。如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。
     *(7)W:表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。
             例如:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。
             如果5日是星期天,则在6日(周一)触发;如果5日在星期一到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份 。
     *(8)LW:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。
     *(9)#:用于确定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2,表示某月的第二个星期三。
     */
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    @Scheduled(cron = "0,15,30,45 * * * * ?")  //每分钟的0秒,15秒,30秒和45秒执行程序
    public void runEveryMinute(){
        System.out.println(sdf.format(new Date()));
        System.out.println("欢迎使用淘宝返利机器人!");
        System.out.println("双十一快到了,使用淘宝返利机器人不仅可以省钱还可以返利哦!");
        System.out.println("没有使用淘宝返利机器人的小伙伴快来使用吧!");
        System.out.println("没有入口?没关系查看下方二维码!");
    }
}

         第四步:查看运行结果

Spring Boot定时任务

Spring Boot定时任务