1.系统级别的定时任务: 临时文件清理、系统信息采集、日志文件切割
2.用户级别的定时任务: 定时向互联网同步时间、定时备份系统配置文件、定时备份数据库的数据。
1.使用SpringBoot创建定时任务(常用)
基于注解(@Scheduled),实现定时任务
BeanPostProcessor是Spring IOC容器给我们提供的一个扩展接口
package org.springframework.beans.factory.config;
import org.springframework.beans.BeansException;
public interface BeanPostProcessor {
//bean初始化方法调用前被调用
Object postProcessBeforeInitialization(Object var1, String var2) throws BeansException;
//bean初始化方法调用后被调用
Object postProcessAfterInitialization(Object var1, String var2) throws BeansException;
}
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {
String cron() default "";
String zone() default "";
long fixedDelay() default -1L;
String fixedDelayString() default "";
long fixedRate() default -1L;
String fixedRateString() default "";
long initialDelay() default -1L;
String initialDelayString() default "";
}
参数解释:
1.Cron表达式参数分别表示:
- 秒(0~59) 例如0/5表示每5秒
- 分(0~59)
- 时(0~23)
- 日(0~31)的某天,需计算
- 月(0~11)
- 周几( 可填1-7 或 SUN/MON/TUE/WED/THU/FRI/SAT)
00 02 * * * ls #每天的凌晨2点整执行
00 02 1 * * ls #每月的1日的凌晨2点整执行
00 02 14 2 * ls #每年的2月14日凌晨2点执行
00 02 * * 7 ls #每周天的凌晨2点整执行
00 02 * 6 5 ls #每年的6月周五凌晨2点执行
00 02 14 * 7 ls #每月14日或每周日的凌晨2点都执行
00 02 14 2 7 ls #每年的2月14日或每年2月的周天的凌晨2点执行
*/10 02 * * * ls #每天凌晨2点,每隔10分钟执行一次
* * * * * ls #每分钟都执行
00 00 14 2 * ls #每年2月14日的凌晨执行命令
*/5 * * * * ls #每隔5分钟执行一次
00 02 * 1,5,8 * ls #每年的1月5月8月凌晨2点执行
00 02 1-8 * * ls #每月1号到8号凌晨2点执行
0 21 * * * ls #每天晚上21:00执行
45 4 1,10,22 * * ls #每月1、10、22日的4:45执行
45 4 1-10 * * ls #每月1到10日的4:45执行
3,15 8-11 */2 * * ls #每隔两天的上午8点到11点的第3和第15分钟执行
0 23-7/1 * * * ls #晚上11点到早上7点之间,每隔一小时执行
15 21 * * 1-5 ls #周一到周五每天晚上21:15执行
2.zone
时区,接收一个java.util.TimeZone#ID
。cron表达式
会基于该时区解析。默认是一个空字符串,即取服务器所在地的时区。比如我们一般使用的时区Asia/Shanghai
。该字段我们一般留空。
3.fixedDelay
上一次执行完毕时间点之后多长时间再执行。如:
@Scheduled(fixedDelayString = "5000") //上一次执行完毕时间点之后5秒再执行
4. fixedDelayString
与 fixedDelay
意思相同,只是使用字符串的形式。唯一不同的是支持占位符。如:
@Scheduled(fixedDelayString = "${time.fixedDelay}")
void testFixedDelayString() {
System.out.println("Execute at " + System.currentTimeMillis());
}
5.fixedRate
上一次开始执行时间点之后多长时间再执行。如:
@Scheduled(fixedRate = 5000) //上一次开始执行时间点之后5秒再执行
6.fixedRateString
与 initialDelay
意思相同,只是使用字符串的形式。唯一不同的是支持占位符。
案例:
/**
* 功能描述:定时任务获取 每小时触发
*
* @author:hdh
* @date: 2020/11/2 11:28
*/
@Scheduled(cron = "0 0 * * * ?")
private void getAppToken() {
//获取
Map<String, String> appRes = WeixinUtil.getAppAccessToken();
if (appRes != null) {
this.appletsService.saveAppToken(appRes.get("accessToken"), WEIXIN_WANS_APPID);
}
}
7.基于接口(SchedulingConfigurer),实现定时任务
springBoot起步类必须@EnableScheduling 开启。
实现SchedulingConfigurer接口并且重写configureTasks方法。
scheduledTaskRegistrar的实现类有以下:
@Component
public class TaskSchedulingConfigurer implements SchedulingConfigurer {
private String cron = "* * * * * ?"; //调用set方法可动态设置时间规则
private static Logger logger = LoggerFactory.getLogger(TaskSchedulingConfigurer.class);
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
scheduledTaskRegistrar.addCronTask(new Runnable() {
@Override
public void run() {
System.out.println("task......");
}
}, cron);
}
}