首页 > 其他分享 >Spring/Spring Boot下如何动态配置计划任务

Spring/Spring Boot下如何动态配置计划任务

时间:2023-02-28 18:22:15浏览次数:54  
标签:task Spring workingService 任务 Boot taskName 动态 public

和Spring对异步任务的支持一样,通过@EnableAsync 注解开启异步的支持,然后通过@Async 注解来指定异步的方法,而真正的异步任务的执行者是TaskExecutor接口 ,它的实现是ThreadPoolTaskExecutor。(若感兴趣可参考《Spring Boot 实战21 - Spring Boot的多线程异步任务》,此处只为比较加深记忆)

同样,Spring对计划任务的支持也是通过@EnableScheduling 开启计划任务的支持,然后通过@Scheduled 注解来制定计划任务,而真正的任务执行者是TaskScheduler 接口,它的实现是ThreadPoolTaskScheduler 。(若对于固定配置的计划任务感兴趣可参考《Spring Boot 实战22 - Spring Boot的计划任务》)

TaskScheduler的接口有三类主要方法:

public interface TaskScheduler {
	
  //指定时间启动计划任务
   ScheduledFuture<?> schedule(Runnable task, Trigger trigger);
  ScheduledFuture<?> schedule(Runnable task, Date startTime);

  //指定频率启动计划任务
   ScheduledFuture<?> scheduleAtFixedRate(Runnable task, Date startTime, long period);
   ScheduledFuture<?> scheduleAtFixedRate(Runnable task, long period);
 
  //指定延迟启动计划任务
   ScheduledFuture<?> scheduleWithFixedDelay(Runnable task, Date startTime, long delay);
   ScheduledFuture<?> scheduleWithFixedDelay(Runnable task, long delay);
}

方法的返回值都是ScheduledFuture 接口,可以使用它来取消任务或者检查任务是否完成。而实际要执行的任务是Runnable的实现类。

那我们可以通过TaskScheduler来实现动态的计划任务的实现。Spring Boot为我们提供了
TaskSchedulingAutoConfiguration自动配置来自动注册TaskScheduler 的Bean。所以我们无需配置可直接注入TaskScheduler的Bean即可使用。

 

 

 

 

Spring Boo同样提供了TaskSchedulingPropertiesTaskScheduler 进行配置,我们可以通过:spring.task.scheduling的属性进行配置。

  • 新建一个演示项目:

 

 

 

 

  • 构建需要定时启动的任务
public class RunnableTask implements Runnable{
    private String taskName;
    private WorkingService workingService;
    
    public RunnableTask(String taskName, WorkingService workingService) {
        this.taskName = taskName;
        this.workingService = workingService;
    }
    
    @Override
    public void run() {
        workingService.work( taskName );
    }
}

这里为了还原实际,一般我们会在任务中调用Spring容器中的其他类进行操作,在此我们引入了一个WorkingService 来真正执行任务。

  • 简单的WorkingService
@Service
@Slf4j
public class WorkingService {

    public void work(String taskName){
        log.info("当前任务:" + taskName +" 在线程" + Thread.currentThread().getName() + "上运行");
    }
}
  • 使用TaskScheduler 的Bean启动定时任务
@Service
public class SchedulingService {
    private final TaskScheduler taskScheduler; // 可直接注入TaskScheduler的Bean
    private final WorkingService workingService; 

    //构造器注入,免@Autowired
    public SchedulingService(TaskScheduler taskScheduler, WorkingService workingService) { 
        this.taskScheduler = taskScheduler;
        this.workingService = workingService;
    }

    public void schedule(String taskName, String cronExpression){
      	//RunnableTask不是一个Bean,不能直接注入workingService,在它的构造器直接传入
        RunnableTask task = new RunnableTask(taskName,workingService);
        CronTrigger cronTrigger = new CronTrigger(cronExpression);
       //api接受实际执行的任务,和定时启动的cron表达式
        taskScheduler.schedule(task,cronTrigger);
    }

    public void scheduleAtFixedRate(String taskName, long period){
        RunnableTask task = new RunnableTask(taskName,workingService);
       //api接受实际执行的任务,和间隔时间
        taskScheduler.scheduleAtFixedRate(task, period);
    }

    public void scheduleWithFixedDelay(String taskName, long delay){
        RunnableTask task = new RunnableTask(taskName,workingService);
       //api接受实际执行的任务,和延迟时间
        taskScheduler.scheduleWithFixedDelay(task, delay);
    }
}
  • 在启动类设置动态配置
@SpringBootApplication
@EnableScheduling
public class DynamicTaskSchedulerApplication {

   public static void main(String[] args) {
      SpringApplication.run(DynamicTaskSchedulerApplication.class, args);
   }

   @Bean
   CommandLineRunner commandLineRunner(SchedulingService schedulingService, WorkingService workingService){
      return args -> {
         schedulingService.schedule("指定时间任务", "50 * * * * THU");
         schedulingService.scheduleAtFixedRate("指定频率任务", 1000);
         schedulingService.scheduleWithFixedDelay("指定延迟任务", 1000);
      } ;
   }
}
  • application.properties 的配置
spring.task.scheduling.pool.size=3
spring.task.scheduling.thread-name-prefix=wisely-
  • 启动程序验证

 

 

 

标签:task,Spring,workingService,任务,Boot,taskName,动态,public
From: https://www.cnblogs.com/telwanggs/p/17165508.html

相关文章

  • 小程序动态增加删除view
    wxml文件:<viewclass="page"data-weui-theme="{{theme}}"><viewclass="weui-form"><viewclass="weui-form__text-area"><h2class="weui-form__title">联营......
  • SpringBoot 访问html
    1、pom.xml文件配置<dependency><!--页面模板依赖--><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</a......
  • u-boot增加新命令
    00.u-boot默认配置为:UBOOT_DEFCONFIG=rk3399_defconfig01.新增文件夹:mkdir /u-boot/test/hello02.编译该文件夹obj-$(CONFIG_TEST_HELLO)+=hello/03.在/u-boot/conf......
  • 【学习笔记】springmvc接收参数
    springmvc接收参数springmvc接收前端传来的数据,主要有三种情况:传来的参数名与处理方法的参数名一致、传来的参数名与处理方法的参数名不一致、传来的参数与已有的对象的属......
  • Spring自动注入
    在spring配置文件中,对引用属性进行自动注入。  一、配置方式1、在<bean>中通过autowire属性配置,只对这个bean生效2、在<beans>中通过default-autowire属......
  • 【必看】RuoYiVuek框架-数据源动态新增、配置如此简单!
    应用场景系统用户只能访问系统配置的数据源(可动态新增修改的)RuoYiVue框架源码点我跳转实现方式1.系统提供Yml文件配置+Druid加载数据源+@DataSource注解+D......
  • 经典算法动态规划(dp问题归纳)
    1,线性dp求连续子区间问题输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。栗子:输入:1-2310-472-......
  • springboot+mybatis+redis+mysql项目搭建,含示例Demo
    转载自:https://blog.csdn.net/qq_40772342/article/details/105049322========== redis在web开发中使用的场景很多,其中缓存是其中一个很重要的使用场景,之所以用作缓存,......
  • 路飞前台全局css,全局配置文件、安装axios、安装vue-cookies、安装elementui、安装boot
    目录1路飞前台全局css,全局配置文件1.1整理项目1.2全局css1.3全局js2安装axios3安装vue-cookies4安装elementui6安装bootstrap和jq7后台主页模块表设计8后台主页......
  • antd校验动态表单
      表单新增一条相当于在数组中新增一条。其实本质是校验数组中每一项的数据。<a-modalv-model:visible="visible":width="900":confirm-loadin......