zoukankan      html  css  js  c++  java
  • Spring4.0编程式定时任务配置

    看过很多定时调度的配置,大多使用XML配置,觉得比较麻烦,也比较老套。这里介绍一种基于spring4.0注解编程式配置定时任务,简单清晰,使用方便..

    至于引入spring相关jar这里不多说,直接切入正题贴上代码:

    @Configuration
    @EnableScheduling
    public class WebAppConfig implements SchedulingConfigurer {
        //TaskScheduler configuration
        @Override
        public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
            logger.info("Configure task registor: {}", taskRegistrar);
            taskRegistrar.setScheduler(taskExecutor());
        }
        
        @Bean(destroyMethod="shutdown")
        public Executor taskExecutor() {
            return Executors.newScheduledThreadPool(4);
        }
    }

    思路:

    我们通常将用于存放配置信息类的类名以 “Config” 结尾,如上我们在WebAppConfig里通过 @Configuration注解,指出该类是Bean配置的信息源,再通过@EnableScheduling开启定时调度,一般情况下实际项目中都是多线程执行定时任务的,所以我们可以通过实现SchedulingConfigurar接口,访问底层的ScheduledRegistrar实例,产生一个Executer对象,然后根据系统的承受能力调整线程池中工作线程的数目,这里我启了4个线程。注意上面使用的@bean(destroyMethod="shutdown")是为了确保当Spring应用上下文关闭的时候任务执行者也被正确地关闭。

    使用:

    @Component("user.task")
    public class userTaskJob {
            /**
         * 每月第一天凌晨一点执行
         */
        @Scheduled(cron="0 0 01 01 * ?")
        public void tempUserTaskDelete() {
            //do something
        }
    }

    @Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注,我们可以理解为将这个类交给spring管理,相当于一个java bean,名字叫user.task

    到此为止我们就可以通过@Scheduled注解使用corn表达式实现任务调度了。

    cron表达式简要介绍:

    一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。依次顺序为:

    • 秒(0~59)
    • 分钟(0~59)
    • 小时(0~23)
    • 天(月)(0~31,需要考虑月的天数)
    • 月(0~11)
    • 天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
    • 年份(1970-2099)

    常用符号代表意思:

    1. * 字符代表所有可能的值。因此,* 在子表达式(月)里表示每个月的含义,* 在子表达式(天(星期))表示星期的每一天
    2. ?字符仅被用于天(月)和天(星期)两个子表达式,表示不指定值当2个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为“?”
    3. / 字符表示起始时间开始触发,然后每隔固定时间触发一次,例如在Minutes域使用5/20,则意味着5分钟触发一次

    几个示例:

    1. 每天的凌晨4点 @Scheduled(cron = "0 0 4 * * *")
    2. 每周日的凌晨5点  @Scheduled(cron = "0 0 5 * * SUN")
    3. 每月第一天凌晨2点10分 @Scheduled(cron="0 10 02 01 * ?")
    4. 每天从下午2点开始到2点55分结束每隔5分钟触发一次 @Schedule(cron = "0 0/5 14 * * ?")
  • 相关阅读:
    10.矩形覆盖 Java
    09.变态跳台阶 Java
    08.青蛙跳台阶 Java
    07.斐波那契数列 Java
    06.旋转数组的最小数字 Java
    05.用两个栈实现队列 Java
    04.重建二叉树 (Java)
    03.从尾到头打印链表 (Java)
    数据结构-有序链表的合并
    数据结构-判断链表是否存在环形链表
  • 原文地址:https://www.cnblogs.com/liliangel/p/5531519.html
Copyright © 2011-2022 走看看