zoukankan      html  css  js  c++  java
  • work_31_任务调度的实现方法

    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);
    
        }
    }

     

  • 相关阅读:
    对TCP/IP协议的理解
    自己想到的几道Java面试题
    Java双重循环实现任意字符串中提取数字子串
    Spring data jpa 依赖配置
    spring data jpa sql
    spring boot 依赖配置
    Freemarker模板和依赖
    spring Data solr依赖文件 和xml配置文件
    根据mysql数据库 定义solr Schema.xml中配置业务域
    自定义solr域中的配置
  • 原文地址:https://www.cnblogs.com/asndxj/p/13925922.html
Copyright © 2011-2022 走看看