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#IDcron表达式会基于该时区解析。默认是一个空字符串,即取服务器所在地的时区。比如我们一般使用的时区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);

    }
}

 

posted on 2020-11-04 14:49  忆夏KhaZix  阅读(105)  评论(0编辑  收藏  举报