一。 Spring 提供了@Scheduled 注解,良好的解决了定时任务的需求,它的实现本质是基于 java 中的 ScheduledExecutorService 类的 schedule 方法。
@Scheduled 注解标注在方法上,它是 Spring 实现的一种计划任务,可以支持如下几种方式运行:
1.固定时间频率运行方法。
2.延迟指定的时间运行方法。
3.按照 cron 表达式定义的时间方式运行方法。
使用@Scheduled 注解的时,按如下步骤:
配置文件中,打开运行执行 Schedule 任务的开关,使用注解 @EnableScheduling。
将某个类的方法标注@Scheduled。
启动 Spring 容器应用:使用注解@EnableScheduling。
@Schduled 默认是基于单线程执行, 所有的定时任务串行执行,这就可能导致运行时间久的任务,会影响到下一个运行周期的任务。如果需要基于多线程执行,则需要配置。
可以在配置文件中加入如下代码:
二。参数详解
该参数接收一个cron表达式,cron表达式是一个字符串,字符串以5或6个空格隔开,分开共6或7个域,每一个域代表一个含义。
cron表达式语法
[秒] [分] [小时] [日] [月] [周] [年]
注:[年]不是必须的域,可以省略[年],则一共6个域
通配符说明:
示例
每隔5秒执行一次:*/5 * * * * ?
每隔1分钟执行一次:0 */1 * * * ?
每天23点执行一次:0 0 23 * * ?
每天凌晨1点执行一次:0 0 1 * * ?
每月1号凌晨1点执行一次:0 0 1 1 * ?
每月最后一天23点执行一次:0 0 23 L * ?
每周星期天凌晨1点实行一次:0 0 1 ? * L
在26分、29分、33分执行一次:0 26,29,33 * * * ?
每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?
时区,接收一个java.util.TimeZone#ID。cron表达式会基于该时区解析。默认是一个空字符串,即取服务器所在地的时区。比如我们一般使用的时区Asia/Shanghai。该字段我们一般留空。
上一次执行完毕时间点之后多长时间再执行。如:
@Scheduled(fixedDelay = 5000) //上一次执行完毕时间点之后5秒再执行
4. fixedDelayString
与 3. fixedDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。如:
@Scheduled(fixedDelayString = “5000”) //上一次执行完毕时间点之后5秒再执行
占位符的使用(配置文件中有配置:
@Scheduled(fixedDelayString = "${time.fixedDelay}")
void testFixedDelayString() {
System.out.println("Execute at " + System.currentTimeMillis());
}
运行结果:
占位符的使用
上一次开始执行时间点之后多长时间再执行。如:
@Scheduled(fixedRate = 5000) //上一次开始执行时间点之后5秒再执行
6. fixedRateString
与 5. fixedRate 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。
第一次延迟多长时间后再执行。如:
@Scheduled(initialDelay=1000, fixedRate=5000) //第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次
8. initialDelayString
与 8. initialDelayString 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。