资讯专栏INFORMATION COLUMN

SpringBoot 设置动态定时任务

IT那活儿 / 1547人阅读
SpringBoot 设置动态定时任务

点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!

在我们平时开发的过程中,定时任务的使用很常见,SpringBoot 定时任务是SpringBoot框架自带而且很容易上手的。一般cron表达式都是在配置文件中配置或者直接写死,这样就会显得比较死板,那么我分享一下我最近学到的动态使用SpringBoot 定时任务。
这里我们直接上代码,在配置文件application.yml中配置好初始cron表达式。
让定时任务跑起来,下图可以看出定时任务是我们正常配置的10s跑一次。

态配置定时任务--CronTrigger

下面我们开始进行动态配置定时任务,上代码:
package com.shsnc.test;

import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.scheduling.support.PeriodicTrigger;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.Date;

/**
* @Author: duanxichao
* @CreateTime: 2022-10-20 10:38
* @Description: TODO
*/

@Data
@Component
public class TestScheduleTask implements SchedulingConfigurer {

   private static final Logger logger = LoggerFactory.getLogger(SchedulingConfigurer.class);

   @Value("${scheduled.testCron}")
   private String cron;

   private Long timer = 10000L;

   @Override
   public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
       // 动态使用cron表达式设置循环间隔
       taskRegistrar.addTriggerTask(new Runnable() {
           @Override
           public void run() {
               logger.info("Current time:{}", LocalDateTime.now());
           }
       }, new Trigger() {
           @Override
           public Date nextExecutionTime(TriggerContext triggerContext) {
               // 使用CronTrigger触发器,可动态修改cron表达式来操作循环规则
               CronTrigger cronTrigger = new CronTrigger(cron);
               Date nextExecutionTime = cronTrigger.nextExecutionTime(triggerContext);

               // 使用不同的触发器,为设置循环时间的关键,区别于CronTrigger触发器,该触发器可随意设置循环间隔时间,单位为毫秒
// PeriodicTrigger periodicTrigger = new PeriodicTrigger(timer);
// Date nextExecutionTime = periodicTrigger.nextExecutionTime(triggerContext);
               return nextExecutionTime;
           }
       });
   }
}
以上是第一种动态配置定时任务代码,使用的是CronTrigger触发器。
下面写一个接口测试一下效果:
接口如图:

此上图我们可以看出定时任务已经从最开始的10s执行一次变成了20s执行一次。这样我们就完成了定时任务时间的修改。

态配置定时任务--PeriodicTrigger

还以一种方式可以通过时间去修改的,可以不使用cron表达式,下面上代码:
package com.shsnc.test;

import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.scheduling.support.PeriodicTrigger;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.Date;

/**
* @Author: duanxichao
* @CreateTime: 2022-10-20 10:38
* @Description: TODO
*/

@Data
@Component
public class TestScheduleTask implements SchedulingConfigurer {

   private static final Logger logger = LoggerFactory.getLogger(SchedulingConfigurer.class);

   @Value("${scheduled.testCron}")
   private String cron;

   private Long timer = 10000L;

   @Override
   public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
       // 动态使用cron表达式设置循环间隔
       taskRegistrar.addTriggerTask(new Runnable() {
           @Override
           public void run() {
               logger.info("Current time:{}", LocalDateTime.now());
           }
       }, new Trigger() {
           @Override
           public Date nextExecutionTime(TriggerContext triggerContext) {
               // 使用CronTrigger触发器,可动态修改cron表达式来操作循环规则
// CronTrigger cronTrigger = new CronTrigger(cron);
// Date nextExecutionTime = cronTrigger.nextExecutionTime(triggerContext);

               // 使用不同的触发器,为设置循环时间的关键,区别于CronTrigger触发器,该触发器可随意设置循环间隔时间,单位为毫秒
               PeriodicTrigger periodicTrigger = new PeriodicTrigger(timer);
               Date nextExecutionTime = periodicTrigger.nextExecutionTime(triggerContext);
               return nextExecutionTime;
           }
       });
   }
}
PeriodicTrigger触发器区别于CronTrigger触发器,该触发器可随意设置循环间隔时间,单位为毫秒,此处我设置61s,我们写个接口来看下效果:
上图我们可以看出定时任务时间变成了61s执行一次。
是不是很简单,两个触发器相比较而言,对于分钟、秒级别的我更喜欢用PeriodicTrigger触发器,而CronTrigger触发器显得更加专业一点
如果你也学会了那就赶紧用起来吧。


本文作者:段席超(上海新炬王翦团队)

本文来源:“IT那活儿”公众号

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129180.html

相关文章

  • SpringBoot中并发定时任务的实现、动态定时任务的实现(看这一篇就够了)

    摘要:也是自带的一个基于线程池设计的定时任务类。其每个调度任务都会分配到线程池中的一个线程执行,所以其任务是并发执行的,互不影响。 原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10659045.html,否则将追究法律责任!!! 一、在JAVA开发领域,目前可以通过以下几种方式进行定时任务 1、单机部署模式 Timer:jdk中...

    BWrong 评论0 收藏0
  • springboot整合quarzt实现动态定时任务

    摘要:而我这里定时任务的触发是要通过接口的方式来触发,所以只用实现以下的调度器即可。我这里简单说下任务的调度器,具体的任务类,触发器,任务什么时候执行是由它决定的。遇到的坑解决方式这个是因为不兼容的问题,所以使用是不会出现这个错误的。 实现定时任务的几种方式: 1.使用linux的crontab 优点: 1.使用方式很简单,只要在crontab中写好 2.随时可以修改,不需要...

    hoohack 评论0 收藏0
  • SpringBoot实现动态控制定时任务-支持多参数

    摘要:由于工作上的原因,需要进行定时任务的动态增删改查,网上大部分资料都是整合框架实现的。本人查阅了一些资料,发现本身就支持实现定时任务的动态控制。 由于工作上的原因,需要进行定时任务的动态增删改查,网上大部分资料都是整合quertz框架实现的。本人查阅了一些资料,发现springBoot本身就支持实现定时任务的动态控制。并进行改进,现支持任意多参数定时任务配置 实现结果如下图所示: sho...

    cjie 评论0 收藏0
  • Springboot整合Quartz实现动态定时任务

    摘要:本文使用实现对定时任务的增删改查启用停用等功能。并把定时任务持久化到数据库以及支持集群。决定什么时候来执行任务。定义的是任务数据,而真正的执行逻辑是在中。封装定时任务接口添加一个暂停恢复删除修改暂停所有恢复所有 简介 Quartz是一款功能强大的任务调度器,可以实现较为复杂的调度功能,如每月一号执行、每天凌晨执行、每周五执行等等,还支持分布式调度。本文使用Springboot+Myba...

    IamDLY 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<