zoukankan      html  css  js  c++  java
  • SpringBoot项目中的定时任务实现方法

    @Scheduled注解

    开启条件

    在启动类上加上 @EnableScheduling 注解
    示例:

    @EnableScheduling
    @SpringBootApplication
    public class Application {
       public static void main(String[] args) {
           SpringApplication.run(Application.class, args);
       }
    }
    

    使用方式

    作用在方法
    可选参数:(常用)cron,fixedDelay,示例:

    @Scheduled(cron = "0/5 * * * * ?") //每隔5秒执行一次
    @Scheduled(fixedDelay = 5000) //上一次执行完毕时间点之后5秒再执行

    cron表达式

    顺序
    范围 0-59 0-59 0-23 1-30(31) 1-12 1-7
    字符 , - * / , - * / , - * / , - * / ? L W C , - * / , - * / L # C

    字符含义

    *:代表所有可能的值
    -:指定范围
    ,:列出枚举  例如在分钟里,"5,15"表示5分钟和20分钟触发
    /:指定增量  例如在分钟里,"3/15"表示从3分钟开始,没隔15分钟执行一次
    ?:表示没有具体的值,使用?要注意冲突
    L:表示last,例如星期中表示7或SAT,月份中表示最后一天31或30,6L表示这个月倒数第6天,FRIL表示这个月的最后一个星期五
    W:只能用在月份中,表示最接近指定天的工作日
    #:只能用在星期中,表示这个月的第几个周几,例如6#3表示这个月的第3个周五

    cron示例

    0 * * * * ? 每1分钟触发一次
    0 0 * * * ? 每天每1小时触发一次
    0 0 10 * * ? 每天10点触发一次
    0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发
    0 30 9 1 * ? 每月1号上午9点半
    0 15 10 15 * ? 每月15日上午10:15触发
    */5 * * * * ? 每隔5秒执行一次
    0 */1 * * * ? 每隔1分钟执行一次
    0 0 5-15 * * ? 每天5-15点整点触发
    0 0/3 * * * ? 每三分钟触发一次
    0 0 0 1 * ?  每月1号凌晨执行一次

    更多参考@Scheduled注解各参数详解定时任务cron表达式详解

    注意事项

    默认为单线程,,任务的执行时机会受上一个任务执行时间的影响。
    多线程定时任务:

    在启动类上加上 @EnableAsync 注解,在对应方法上加上 @Async注解

    @EnableAsync
    @EnableScheduling
    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    
     @Async
     @Scheduled(fixedDelay = 1000) //间隔1秒 
     public void first() throws InterruptedException { 
     System.out.println("第一个定时任务开始 : " + LocalDateTime.now().toLocalTime() + "
    线程 : " + Thread.currentThread().getName()); System.out.println(); Thread.sleep(1000 * 10);
     }
     
     @Async
     @Scheduled(fixedDelay = 1000) //间隔1秒 
     public void Second() throws InterruptedException { 
     System.out.println("第二个定时任务开始 : " + LocalDateTime.now().toLocalTime() + "
    线程 : " + Thread.currentThread().getName()); System.out.println(); Thread.sleep(1000 * 10);
     }
    

    更多参考玩转SpringBoot之定时任务详解


    ThreadPoolTaskScheduler类

    使用方式

    @Autowired
    private ThreadPoolTaskScheduler tradingScheduler;
    
    //任务队列
    private ConcurrentHashMap<Runnable, ScheduledFuture<?>> scheduledFutureMap = new ConcurrentHashMap<>();
    
    public void scheduleSyncTask() {
            //每5分钟一次
            String cron = "0 0/5 * * * ?";
            ScheduledFuture<?> future = tradingScheduler.schedule(() -> { /**Runnable线程run()方法代码**/}, new CronTrigger(cron));
            scheduledFutureMap.put(runner, future);
            log.info("{} 任务启动成功",LocalDateTime.now());
        }
    

    RestFul接口来管理任务
    参考 Spring动态管理定时任务——ThreadPoolTaskScheduler

    注意事项

    默认定时线程池线程为 1 ,即 private volatile int poolSize = 1; ,因此多个定时任务串行执行
    修改poolSize

    @Bean(name = "sync")
    public ThreadPoolTaskScheduler threadPoolTaskScheduler4Sync() {
        ThreadPoolTaskScheduler syncScheduler = new ThreadPoolTaskScheduler();
        syncScheduler.setPoolSize(5);
        syncScheduler.setThreadGroupName("syncTg");
        syncScheduler.setThreadNamePrefix("syncThread-");
        return syncScheduler;
    }
    @Resource(name = "sync")
    private ThreadPoolTaskScheduler threadPoolTaskScheduler;
    

    更多参考
    ThreadPoolTaskScheduler注意事项之线程池大小poolSize以及通过JMX修改


    Quartz框架

    简介

    参考 Quartz框架介绍

    SpringBoot整合Quartz

    参考 SpringBoot之整合Quartz调度框架-基于Spring Boot2.0.2版本

  • 相关阅读:
    我来了
    学习笔记-数据仓库和数据挖掘
    React及JSX常见问题
    JavaScript笔记,不定期更新
    比strlen执行速度更快的处理字符串长度的函数
    LESS笔记/注意手册(更新中)
    鼠标移到图片变化的三种写法(可移植性强、代码少)
    信息安全技术作业5--散列函数的应用及其安全性
    结对作业(web)
    读《构建之法》第4、17章
  • 原文地址:https://www.cnblogs.com/wuba/p/13047457.html
Copyright © 2011-2022 走看看