SpringBoot实现定时任务(@Scheduled注解)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_42682302/article/details/101026530
public @interface Scheduled {
	String cron() default "";

	String zone() default "";

	long fixedDelay() default -1;

	String fixedDelayString() default "";

	long fixedRate() default -1;

	String fixedRateString() default "";

	long initialDelay() default -1;
	
	String initialDelayString() default "";

}

1.cron
cron表达式是一个字符串,以5或6个空格隔开,分为6或7个域,每一个域代表一个含义。

字段 允许值 允许的特殊符号
0-59 ,-*/
0-59 ,-*/
0-23 ,-*/
1-31 , - * / ? L W C
1-12 ,-*/
星期 0 - 7(0,7都是SUN) 或 SUN - SAT , - * / ? L C #

特殊字符解释

特殊字符 允许值
, 枚举
- 区间
* 任意
/ 步长
? 日和星期冲突匹配
L 最后(Last)
W 工作日(weekday)
C 使用Calendar日历类计算得出的值
# 星期匹配

举例

解释
0 0/5 14,18 * * ? 每天14点和18点整,每个5分钟执行1次
0 15 10 ? * 1-6 每个月的星期一至星期六10点15分执行1次
0 0 2 ? * 6L 每个月最后一个星期六2点执行1次
0 0 2 LW * ? 每个月的最后一个工作日2点执行1次
0 0 2-4 ? * 1#1 每个月的第一个星期一2点到4点,每个整点都执行1次

2. zone

时区,接收时区的ID值(java.util.TimeZone)。默认留空,即取服务器所在地时区。也可指定,一般使用的上海时区Asia/Shanghai。可使用如下代码获取时区ID列表:

String[] tz=TimeZone.getAvailableIDs();
System.out.println(Arrays.toString(tz));

结果为当前可用时区ID列表(部分):
Africa/Abidjan,
Africa/Accra,
Africa/Addis_Ababa,
Africa/Algiers,
Africa/Asmara,
Africa/Asmera,
Africa/Bamako,
...

3.fixedDelay和fixedDelayString
fixedDelay:上一次执行完毕后等待3秒再执行1次。
fixedDelayString:与fixedDelay类似,但是支持占位符,可在配置文件中配置。

@Scheduled(fixedDelay = 3000)

//配置:time.fixedDelayString=3000
 @Scheduled(fixedDelayString = "${time.fixedDelayString}")

4.fixedRate和fixedRateString
fixedRate:上一次执行开始后等待3秒再执行1次。
fixedRateString:与fixedRate类似,但是支持占位符,可在配置文件中配置。

@Scheduled(fixedRate = 3000)

//配置:time.fixedRateString=3000
@Scheduled(fixedRateString = "${time.fixedRateString}")

5. initialDelay和initialDelayString
initialDelay:第一次延迟1秒后再执行,之后按fixedRate的规则每3秒执行一次。
initialDelayString:与 initialDelay类似,但是支持占位符,可在配置文件中配置。

@Scheduled(initialDelay=1000, fixedRate=3000)

配置:time.initialDelayString=1000
@Scheduled(initialDelayString=${time.initialDelayString}, fixedRate=3000)

测试

1.编写一个ScheduledService类,需要注意需要给类加入@Service注解,将它加入到SpringBoot的容器中。编写一个方法在控制台打印执行方法时当前的时间,来测试定时任务。

@Service
public class ScheduledService {
    @Scheduled(cron = "* * * * * SUN-MON")	//不能写为MON-SUN
    public void hello(){
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date=sdf.format(new Date());
        System.out.println("定时任务执行:"+date);
    }
}

2.在SpringBoot主程序类中开启允许定时任务。

@EnableScheduling
@SpringBootApplication
public class SpringBootScheduleTestApplication {

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

3.运行程序,可以看到定时任务的执行,在控制台每秒打印一次信息。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42682302/article/details/101026530