SpringBoot实现动态定时任务的示例代码

目录
  • 前言
  • 配置文件
  • 定时任务核心类
  • 提供修改cron表达式的controller

前言

之前在SpringBoot项目中简单使用定时任务,不过由于要借助cron表达式且都提前定义好放在配置文件里,不能在项目运行中动态修改任务执行时间,实在不太灵活。现在我们就来实现可以动态修改cron表达式的定时任务。

配置文件

application-task.yml,其余的配置 application.yml 等就按照springBoot正常配置即可

task:
  cron: 0/10 * * * * ?
  timer: 10

定时任务核心类

import cn.hutool.core.date.DateUtil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.PeriodicTrigger;

import java.util.Date;

@Data
@Slf4j
@Configuration
@EnableScheduling
@ConfigurationProperties(prefix = "task")
public class WorkScheduleTask  implements SchedulingConfigurer {

    private String cron;

    private Long timer;

    @Override

    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        // 动态使用cron表达式设置循环间隔
        taskRegistrar.addTriggerTask(() -> {
            String dateTime = DateUtil.formatDateTime(new Date());
            String threadName = Thread.currentThread().getName();
            log.info("定时任务开始[configureTasks] :{},线程:{}", dateTime, threadName);
        }, triggerContext -> {
            // 使用CronTrigger触发器,可动态修改cron表达式来操作循环规则
            // 只能定义小于等于间隔59秒
//          CronTrigger cronTrigger = new CronTrigger(cron);
//          return cronTrigger.nextExecutionTime(triggerContext);

            // 能定义大于等于间隔59秒
            // 使用不同的触发器,为设置循环时间的关键,区别于CronTrigger触发器,
            // 该触发器可随意设置循环间隔时间,单位为毫秒
            long seconds = timer * 1000;  // 毫秒转秒
            PeriodicTrigger periodicTrigger = new PeriodicTrigger(seconds);
            return periodicTrigger.nextExecutionTime(triggerContext);
        });
    }
}

提供修改cron表达式的controller

@Slf4j
@CrossOrigin
@RestController
@RequestMapping("/updateTask")
public class UpdateTaskController {

    @Resource
    private WorkScheduleTask workScheduleTask;

    @PostMapping("/updateCron")
    public String updateCron(String cron) {
        log.info("new cron :{}", cron);
        workScheduleTask.setCron(cron);
        return "ok";
    }

    @PostMapping("/updateTimer")
    public String updateTimer(Long timer) {
        log.info("new timer :{}", timer);
        workScheduleTask.setTimer(timer);
        return "ok";
    }

}

一开始定时任务的执行时机和周期都是配置文件指定的,但是我们如果对于执行的周期不满意,我们可以调用接口进行修改定时任务,但是需要注意的是,这种外暴露的接最好做一下安全校验,不是谁都可以调用,否则被别人扫描到这个接口,然后随意修改,会影响我们正常的业务流程,严重可能会造成严重损失。

到此这篇关于SpringBoot实现动态定时任务的示例代码的文章就介绍到这了,更多相关SpringBoot动态定时任务内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Springboot自带定时任务实现动态配置Cron参数方式

    目录 Springboot自带定时任务实现动态配置Cron参数 SpringBoot定时任务的四种实现方式(主要) spring动态配置cron表达式,不需要停服 SchedulingConfigurer接口实现动态加载cron表达式 Springboot自带定时任务实现动态配置Cron参数 同学们,我今天分享一下SpringBoot动态配置Cron参数.场景是这样子的:后台管理界面对定时任务进行管理,可动态修改执行时间,然后保存入库,每次任务执行前从库里查询时间,以达到动态修改Cron参数的效

  • SpringBoot动态定时功能实现方案详解

    目录 业务场景 环境准备 实现方案 归纳总结 业务场景 基于上篇程序,做了一版动态定时程序,然后发现这个定时程序需要在下次执行的时候会加载新的时间,所以如果改了定时程序不能马上触发,所以想到一种方法,在保存定时程序的时候将cron表达式传过去,然后触发定时程序,下面看看怎么实现 环境准备 开发环境 JDK 1.8 SpringBoot2.2.1 Maven 3.2+ 开发工具 IntelliJ IDEA smartGit Navicat15 实现方案 基于上一版进行改进: 先根据选择的星期生成c

  • SpringBoot 实现动态添加定时任务功能

    目录 代码结构 1.配置类 2.定时任务类型枚举 3.实际执行任务实现类 4.定时任务包装器 5.任务注册器(核心) 6.使用 最后 最近的需求有一个自动发布的功能, 需要做到每次提交都要动态的添加一个定时任务 代码结构 1. 配置类 package com.orion.ops.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conf

  • SpringBoot设置动态定时任务的方法详解

    之前写过文章记录怎么在SpringBoot项目中简单使用定时任务,不过由于要借助cron表达式且都提前定义好放在配置文件里,不能在项目运行中动态修改任务执行时间,实在不太灵活. 经过网上搜索学习后,特此记录如何在SpringBoot项目中实现动态定时任务. 因为只是一个demo,所以只引入了需要的依赖: <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <ar

  • SpringBoot+Quartz实现动态定时任务

    本文实例为大家分享了springBoot+Quartz实现动态定时任务的具体代码,供大家参考,具体内容如下 目前常用的几种任务调度 Timer,简单无门槛,一般也没人用. spring @Scheduled注解,一般集成于项目中,小任务很方便. 开源工具 Quartz,分布式集群开源工具,以下两个分布式任务应该都是基于Quartz实现的,可以说是中小型公司必选,当然也视自身需求而定. 分布式任务 XXL-JOB,是一个轻量级分布式任务调度框架,支持通过 Web 页面对任务进行 CRUD 操作,支

  • Springboot实现动态定时任务流程详解

    目录 一.静态 二.动态 1.基本代码 2.方案详解 2.1 初始化 2.2 单次执行 2.3 停止任务 2.4 启用任务 三.小结 一.静态 静态的定时任务可以直接使用注解@Scheduled,并在启动类上配置@EnableScheduling即可 @PostMapping("/list/test1") @Async @Scheduled(cron = "0 * * * * ?") public void test1() throws Exception { Ob

  • SpringBoot实现动态定时任务的示例代码

    目录 前言 配置文件 定时任务核心类 提供修改cron表达式的controller 前言 之前在SpringBoot项目中简单使用定时任务,不过由于要借助cron表达式且都提前定义好放在配置文件里,不能在项目运行中动态修改任务执行时间,实在不太灵活.现在我们就来实现可以动态修改cron表达式的定时任务. 配置文件 application-task.yml,其余的配置 application.yml 等就按照springBoot正常配置即可 task: cron: 0/10 * * * * ? t

  • Springboot整个Quartz实现动态定时任务的示例代码

    简介 Quartz是一款功能强大的任务调度器,可以实现较为复杂的调度功能,如每月一号执行.每天凌晨执行.每周五执行等等,还支持分布式调度.本文使用Springboot+Mybatis+Quartz实现对定时任务的增.删.改.查.启用.停用等功能.并把定时任务持久化到数据库以及支持集群. Quartz的3个基本要素 Scheduler:调度器.所有的调度都是由它控制. Trigger: 触发器.决定什么时候来执行任务. JobDetail & Job: JobDetail定义的是任务数据,而真正的

  • SpringBoot Scheduling定时任务的示例代码

    目录 开启定时任务注解@EnableScheduling @Scheduled添加定时任务 Cron表达式 在线cron工具 适应场景 springBoot提供了定时任务的支持,通过注解简单快捷,对于日常定时任务可以使用. 开启定时任务注解@EnableScheduling @EnableScheduling @SpringBootApplication public class DockerApplication { public static void main (String[] args

  • springboot实现mock平台的示例代码

    目录 一.实现场景: 1.1请求同一个接口,不同的传参/ip返回的结果不一样. 1.2 返回的结果不是写死的,是动态数据,需要对数据进行处理 1.3 回调能力 1.4响应时间 1.5 hook参数 1.6 透传请求 二.依赖 三.开始写 3.1 新建一个controller,简单的建一个服务,试试是否能ping通 3.2   新建MockController1,/** 这里指的是任意的URI 一.实现场景: 1.1请求同一个接口,不同的传参/ip返回的结果不一样. 数据的匹配 以create_a

  • Java实现定时任务的示例代码

    目录 xxl-job官网 引入依赖 配置信息(application.properties) 配置类(XxlJobConfiguration) 调用xxl-job-admin模块的接口 添加调度任务 调度任务 xxl-job官网 https://www.xuxueli.com/xxl-job/ 调用xxl-job中的xxl-job-admin模块启用 引入依赖 <!-- 调度任务 --> <dependency> <groupId>com.xuxueli</gro

  • 史上最简单的MyBatis动态SQL入门示例代码

    假如有如下的关于书籍基本信息的表: DROP DATABASE IF EXISTS `books`; CREATE DATABASE `books`; USE books; DROP TABLE IF EXISTS `book`; CREATE TABLE `book` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(128) DEFAULT NULL, `author` varchar(64) DEFAULT NULL, `pres

  • springboot前后台数据交互的示例代码

    本文介绍了springboot前后台数据交互的示例代码,分享给大家,具体如下: 1.在路径中传递数据,比如对某个数据的id:123 前台发送:格式大致如下 在路径中传数据 后台接收: 后台接收数据 后台接收结果 2.查询字符串传递数据前台发送:   前台使用Querystring发送数据 后台接收: 这里@RequestParm可以不写,在后台找不到前台对应的字段时,输出null,在@RequestParam中指定的话输出指定的值(前台没给出字段时): 后台接收queryString方式传递的数

  • SpringBoot集成slf4j+log4j2的示例代码

    本文介绍了SpringBoot集成slf4j+log4j2的示例代码,分享给大家,具体如下: Maven依赖 <!--增加log4j2依赖↓--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> <dependency&g

  • SpringBoot 微信退款功能的示例代码

    一:微信支付证书配置 二:证书读取以及读取后的使用 package com.zhx.guides.assistant.config.wechatpay; import org.apache.commons.io.IOUtils; import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.H

随机推荐