springboot项目使用SchedulingConfigurer实现多个定时任务

Posted 小志的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot项目使用SchedulingConfigurer实现多个定时任务相关的知识,希望对你有一定的参考价值。

目录

一、引入依赖

  • pom文件引入依赖包

     <!--lombok-->
     <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <optional>true</optional>
      </dependency>
      <!--hutool插件-->
      <dependency>
          <groupId>cn.hutool</groupId>
          <artifactId>hutool-all</artifactId>
          <version>5.7.7</version>
      </dependency>
    

二、配置文件属性配置

  • application.yml配置文件配置

    upload:
        #每天几点几分执行
        taskOnecron: 0 47 21 ? * *
        #每2分钟执行一次
        taskTwocron: 0 0/2 * * * ?
    

三、代码目录结构

  • 目录结构如下图:

四、示例代码

4.1、定义 定时任务基础接口

  • 定时任务基础接口 代码示例

    package com.xz.jdk11.schedule;
    
    /**
     * @author xz
     * @description 定义 定时任务基础接口
     */
    public interface BaskTask extends Runnable
        //获取执行频率
        String getCron();
        //执行任务逻辑
        void execute();
    
    

4.2、定义 定时任务一(每天几点几分执行)

  • 定时任务一(每天几点几分执行) 代码示例

    package com.xz.jdk11.schedule;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    import java.util.Calendar;
    
    /**
     * @author xz
     * @description 定时任务一(每天几点几分执行)
     */
    @Slf4j
    @Component
    public class TaskOne implements BaskTask
        @Value("$upload.taskOnecron")
        private String taskOnecron;
    
        @Override
        public String getCron() 
            return taskOnecron;
        
    
        @Override
        public void execute() 
            log.info("定时任务一(每天几点几分执行一次),执行开始时间:",Calendar.getInstance().getTime());
        
        @Override
        public void run() 
            execute();
        
    
    

4.3、定义 定时任务二(每几分钟执行一次)

  • 定时任务二(每几分钟执行一次) 代码示例

    package com.xz.jdk11.schedule;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    import java.util.Calendar;
    
    /**
     * @author xz
     * @description 定时任务二(每几分钟执行一次)
     */
    @Slf4j
    @Component
    public class TaskTwo implements BaskTask
        @Value("$upload.taskTwocron")
        private String taskTwocron;
    
        @Override
        public String getCron() 
            return taskTwocron;
        
    
        @Override
        public void execute() 
            log.info("定时任务二:每几分钟执行一次,执行开始时间:", Calendar.getInstance().getTime());
        
    
        @Override
        public void run() 
            execute();
        
    
    

4.4、定义 定时任务注册器

  • 定时任务注册器 代码示例

    package com.xz.jdk11.schedule;
    
    import cn.hutool.core.util.StrUtil;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.annotation.EnableScheduling;
    import org.springframework.scheduling.annotation.SchedulingConfigurer;
    import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
    import org.springframework.scheduling.config.ScheduledTaskRegistrar;
    import org.springframework.scheduling.support.CronTrigger;
    
    import java.util.Map;
    
    /**
     * @author xz
     * @description 定时任务注册器
     */
    @EnableScheduling
    @Configuration
    @Slf4j
    public class ReUploadTask implements SchedulingConfigurer 
    
        @Autowired
        private ApplicationContext applicationContext;
        @Override
        public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) 
            //在注册器添加定时任务前,添加线程池
            ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
            threadPoolTaskScheduler.setPoolSize(10);
            threadPoolTaskScheduler.initialize();
            scheduledTaskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
            //获取所有的定时任务
            Map<String,BaskTask> map=applicationContext.getBeansOfType(BaskTask.class);
            //遍历注册
            for(String key:map.keySet())
                BaskTask baskTask = map.get(key);
                scheduledTaskRegistrar.addTriggerTask(
                        baskTask,triggerContext -> 
                            if(StrUtil.isBlank(baskTask.getCron()))
                                return null;
                            
                            return new CronTrigger(baskTask.getCron()).nextExecutionTime(triggerContext);
                        
                );
            
        
    
    

4.5、运行springboot项目查看输出结果

  • 输出结果如下所示:

以上是关于springboot项目使用SchedulingConfigurer实现多个定时任务的主要内容,如果未能解决你的问题,请参考以下文章

解决IDEA无法识别SpringBoot项目

SpringBoot 使用maven创建springboot项目

JavaSpring Boot项目的创建和使用

springboot项目怎么调用深度算法

springboot入门一,使用myEclipse新建一个springboot项目

springboot项目集成 redis详解