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进入到第二步
第二步:这一步填写自己的Group和Artifact其他默认,然后点击next,进入下一步
第三步:咱们以Web项目为例,所以选择Web加入到工程当中,点击next,进入最后一步
第四步:只要第二步中名字改了,那这一步可以直接点击Finish,当然了,如果要把工程创建到其他地方,那就选择Project location选择你的工作区间,这个时候就会自动创建一个Spring Boot Maven Web项目了
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("没有入口?没关系查看下方二维码!");
}
}
第四步:查看运行结果