通过SchedulingConfigurer 接口完成动态定时任务

news2024/9/22 21:13:56

通过SchedulingConfigurer 接口完成动态定时任务

一.背景

在Spring中,除了使用@Scheduled注解外,还可以通过实现SchedulingConfigurer接口来创建定时任务。它们之间的主要区别在于灵活性和动态性。@Scheduled注解适用于固定周期的任务,一旦任务的执行时间设定,就无法在运行时动态更改,因此如果需要调整任务执行周期,通常需要停止服务、修改配置,然后重启服务。相比之下,通过实现SchedulingConfigurer接口来配置定时任务可以实现更大的灵活性,可以在运行时动态调整任务的执行时间或周期,而无需停止和重启服务。这种方式特别适合需要根据外部条件或运行时数据动态调整任务调度的场景。

二.实现

2.1.创建数据表

我们创建了一个名为scheduled的数据库表,用于存储定时任务的配置信息,并向该表中插入了一条具体的定时任务配置记录。

CREATE TABLE `scheduled` (
	`id` INT,
	`task_key` VARCHAR ( 127 ) COMMENT '任务key值',
	`name` VARCHAR ( 127 ) COMMENT '任务名称',
	`cron` VARCHAR ( 63 ) COMMENT '任务表达式',
	`status` INT DEFAULT 0 COMMENT '状态(1.禁用; 0.启用)',
PRIMARY KEY ( `id` ) 
) COMMENT = '定时任务配置表';

INSERT INTO `scheduled` (`id`, `task_key`, `name`, `cron`, `status`) VALUES (1, 'myTask', '我的定时任务', '0 0/5 * * * ?', 0);

2.2.创建实体类

这段代码使用了JPA(Java Persistence API)注解,定义了一个与数据库表 scheduled 对应的Java实体类 Scheduled。它包含了与定时任务相关的基本属性字段,并通过注解将这些字段映射到数据库表的对应列上。同时,使用Lombok的 @Data 注解简化了实体类的getter、setter等方法的编写。

package com.temperature.humidity.system.entity;

import lombok.Data;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Table(name = "scheduled")
@Data
@Entity
public class Scheduled {

    @Id
    @Column(name = "id")
    private Integer id;

    @Column(name = "task_key")
    private String taskKey;

    @Column(name = "name")
    private String name;

    @Column(name = "cron")
    private String cron;

    @Column(name = "status")
    private Integer status;

}

2.3.Dao层接口

通过 taskKey 和 status 属性来查找 Scheduled 实体对象。

package com.temperature.humidity.system.repository.jpa;

import com.temperature.humidity.system.entity.Scheduled;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface ScheduledRepository extends JpaRepository<Scheduled, Integer> {
	//通过taskKey和status查找Scheduled
    Scheduled findFirstByTaskKeyAndStatus(String taskKey, Integer status);
}

2.4.定时任务父类

BaseScheduleTask 抽象类提供了一个通用的定时任务结构,使得子类只需实现具体的任务逻辑和 cron 表达式的获取逻辑即可。它利用了 Spring 的定时任务配置支持,通过依赖注入和抽象方法的方式,实现了定时任务的灵活配置和执行。

package com.temperature.humidity.system.schedule;

import com.temperature.humidity.system.entity.Scheduled;
import com.temperature.humidity.system.repository.jpa.ScheduledRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;

/**
 * 定时任务父类
 */
@Slf4j
public abstract class BaseScheduleTask implements SchedulingConfigurer {
    private static final String LOG_HEADER = "[定时任务父类]";

    @Autowired
    private ScheduledRepository scheduledRepository;

    @Autowired
    private TaskScheduler threadPoolTaskScheduler;

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
        taskRegistrar.addTriggerTask(
                //1.添加任务内容(Runnable)
                this::execTask,
                //2.设置执行周期(Trigger)
                triggerContext -> new CronTrigger(this.childGetCron()).
                        nextExecutionTime(triggerContext)
        );
    }

    public void execTask() {
        this.childExec();
    }

    /**
     * 子类实际的工作内容
     */
    public abstract void childExec();

    /**
     * 子类获得执行的cron表达式
     *
     * @return
     */
    public abstract String childGetCron();

    public abstract String getName();

    /**
     * 获取任务执行的Cron表达式
     */
    protected String getTimeCron(String paraSortCode, String name, String defaultValue) {
        String cron = defaultValue;
        Scheduled scheduled = scheduledRepository.findFirstByTaskKeyAndStatus(paraSortCode, 0);
        if (scheduled != null) {
            cron = scheduled.getCron();
        }
        log.info("{},当前任务【{}-{}】,获得的cron表达式:{}", LOG_HEADER, paraSortCode, name, cron);
        return cron;
    }
}

2.5.定时任务子类

这里我们举了一个例子,通过继承BaseScheduleTask 并重写其的一些方法来达到动态配置定时任务的目的。

  • childExec:实际的工作内容
  • childGetCron:获得执行的cron表达式。
  • getName:为了控制台打印出一个方便记忆的定时任务名字。
package com.temperature.humidity.system.schedule.task;

import com.temperature.humidity.system.schedule.BaseScheduleTask;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Date;

@Slf4j
@Component
public class MyTask extends BaseScheduleTask {
    @Override
    public void childExec() {
        log.info("我被执行了当前时间为{}", new Date());
    }

    @Override
    public String childGetCron() {
        return getTimeCron("myTask", getName(), "0 0/15 * * * ?");
    }

    @Override
    public String getName() {
        return "我的定时任务";
    }
}

三.效果

效果如下所示,可以看到实际执行的任务按照数据库配置的corn表达式执行,而不是之前设置的默认的执行。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1932732.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【STM32 HAL库】I2S的使用

使用CubeIDE实现I2S发数据 1、配置I2S 我们的有效数据是32位的&#xff0c;使用飞利浦格式。 2、配置DMA **这里需要注意&#xff1a;**i2s的DR寄存器是16位的&#xff0c;如果需要发送32位的数据&#xff0c;是需要写两次DR寄存器的&#xff0c;所以DMA的外设数据宽度设置16…

JavaWeb服务器-Tomcat(Tomcat概述、Tomcat的下载、安装与卸载、启动与关闭、常见的问题)

Tomcat概述 Tomcat服务器软件是一个免费的开源的web应用服务器。是Apache软件基金会的一个核心项目。由Apache&#xff0c;Sun和其他一些公司及个人共同开发而成。 由于Tomcat只支持Servlet/JSP少量JavaEE规范&#xff0c;所以是一个开源免费的轻量级Web服务器。 JavaEE规范&…

Vscode中Github copilot插件无法使用(出现感叹号)解决方案

1、击扩展或ctrl shift x ​​​​​​​ 2、搜索查询或翻找到Github compilot 3、点击插件并再左侧点击登录github 点击Sign up for a ... 4、跳转至github登录页&#xff0c;输入令牌完成登陆后返回VScode 5、插件可以正常使用

uni-app:文字竖直排列,并且在父级view中水平竖直对齐

一、效果 二、代码 <template><view class"parent"><text class"child">这是竖直排列的文字</text></view> </template> <script>export default {data() {return {}},methods: {},}; </script> <sty…

FATE Flow 源码解析 - 日志输出机制

背景介绍 在 之前的文章 中介绍了 FATE 的作业处理流程&#xff0c;在实际的使用过程中&#xff0c;为了查找执行中的异常&#xff0c;需要借助运行生成的日志&#xff0c;但是 FATE-Flow 包含的流程比较复杂&#xff0c;对应的日志也很多&#xff0c;而且分散在不同的文件中&…

windows和linux的等保加固测评的经验分享

一头等保加固测评的牛马&#xff0c;需要能做到一下午测评n个服务器 接下来就讲讲如何当一头xxxxxxxxx》严肃的等保测评加固的经验分享&#xff08; 一、window等保 首先你要自己按着教程在虚拟机做过一遍&#xff08;win2012和win2008都做过一遍&#xff0c;大概windows的…

抖音短视频seo矩阵系统源码(搭建技术开发分享)

#抖音矩阵系统源码开发 #短视频矩阵系统源码开发 #短视频seo源码开发 一、 抖音短视频seo矩阵系统源码开发&#xff0c;需要掌握以下技术&#xff1a; 网络编程&#xff1a;能够使用Python、Java或其他编程语言进行网络编程&#xff0c;比如使用爬虫技术从抖音平台获取数据。…

How to integrate GPT-4 model hosted on Azure with the gptstudio package

题意&#xff1a;怎样将托管在Azure上的GPT-4模型与gptstudio包集成&#xff1f; 问题背景&#xff1a; I am looking to integrate the OpenAI GPT-4 model into my application. Here are the details I have: Endpoint: https://xxxxxxxxxxxxxxx.openai.azure.com/Locatio…

Gradio从入门到精通(8)---基础组件介绍2

文章目录 一、基础组件详解1.Dropdown2.Image3.Audio4.File 总结 一、基础组件详解 1.Dropdown 用途&#xff1a; 提供下拉菜单选项。 初始化参数&#xff1a; choices: 可选择的选项列表。 value: 默认选中的值。可以是字符串、列表或是一个可调用对象。 type: 组件返回…

【有效验证】解决SQLyog连接MYSQL的错误 1251 - Client does not support

目录 一、原因分析&#xff1a; 二、进入到mysql 三、查看当前加密方式 四、更改加密方式 五、查看是否成功 前言&#xff1a;使用一个开源软件使用sqlyog、navcat都报1251错误&#xff0c;网上都是提示升级客户端&#xff0c;还有一种就是修改mysql配置。本文就是修改配置…

逆向案例二十三——请求头参数加密,某区块链交易逆向

网址&#xff1a;aHR0cHM6Ly93d3cub2tsaW5rLmNvbS96aC1oYW5zL2J0Yy90eC1saXN0L3BhZ2UvNAo 抓包分析&#xff0c;发现请求头有X-Apikey参数加密&#xff0c;其他表单和返回内容没有加密。 直接搜索关键字&#xff0c;X-Apikey&#xff0c;找到疑似加密位置&#xff0c;注意这里…

R语言实现SVM算法——分类与回归

### 11.6 基于支持向量机进行类别预测 ### # 构建数据子集 X <- iris[iris$Species! virginica,2:3] # 自变量&#xff1a;Sepal.Width, Petal.Length y <- iris[iris$Species ! virginica,Species] # 因变量 plot(X,col y,pch as.numeric(y)15,cex 1.5) # 绘制散点图…

【DGL系列】DGLGraph.out_edges简介

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 函数说明 用法示例 示例 1: 获取所有边的源节点和目标节点 示例 2: 获取特定节点的出边 示例 3: 获取所有边的边ID 示例 4: 获取所有信息&a…

【概率论三】参数估计:点估计(矩估计、极大似然法)、区间估计

文章目录 一. 点估计1. 矩估计法2. 极大似然法2.1. 似然函数2.2. 极大似然估计法 3. 评价估计量的标准3.1. 无偏性3.2. 有效性3.3. 一致性 二. 区间估计1. 区间估计的概念2. 正态总体参数的区间估计 参数估计讲什么 由样本来确定未知参数参数估计分为点估计与区间估计 一. 点估…

Ubuntu20.04从零开搭PX4MavrosGazebo环境并测试

仅仅是个人搭建记录 参考链接&#xff1a; https://zhuanlan.zhihu.com/p/686439920 仿真平台基础配置&#xff08;对应PX4 1.13版&#xff09; 语雀 mkdir -p ~/tzb/catkin_ws/src mkdir -p ~/tzb/catkin_ws/scripts cd catkin_ws && catkin init catkin build cd…

ECMP等价多路由机制,大模型训练负载均衡流量极化冲突原因,万卡(大规模)集群语言模型(LLM)训练流量拥塞特点

大规模集群&#xff0c;大语言模型(LLM)训练流量特点&#xff0c;ECMP&#xff08;Equal-Cost Multi-Path Routing&#xff09;流量极化拥塞原因。 视频分享在这&#xff1a; 2.1 ECMP等价多路由&#xff0c;大模型训练流量特点&#xff0c;拥塞冲突极化产生原因_哔哩哔哩_bi…

【GraphRAG】微软 graphrag 效果实测

GraphRAG 本文将基于以下来源&#xff0c;对Microsoft GraphRAG分析优缺点、以及示例实测分析。 1. Source 代码仓库&#xff1a; Welcome to GraphRAGhttps://microsoft.github.io/graphrag/ 微软文章1&#xff08;2024.2.13&#xff09;&#xff1a;GraphRAG: Unlocking…

电脑系统重装数据被格式化,那些文件还有办法恢复吗?

在日常使用电脑的过程中&#xff0c;系统重装或格式化操作是常见的维护手段&#xff0c;尤其是在遇到系统崩溃、病毒感染或需要升级系统时。然而&#xff0c;这一操作往往伴随着数据丢失的风险&#xff0c;尤其是当C盘&#xff08;系统盘&#xff09;和D盘&#xff08;或其他数…

【linux】信号的理论概述和实操

目录 理论篇 信号概述 信号的分类 信号机制 理解硬件中断 异步 信号对应的三种动作 信号产生的条件 终端按键 系统调用 软件条件 硬件异常 除0错误 野指针 OS对于错误的态度 信号在进程中的内核数据结构 信号的处理 CPU的内核态和用户态概述 进程处理信号的时…

MATLAB科研数据可视化教程

原文链接&#xff1a;MATLAB科研数据可视化https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247609462&idx3&snf7043936fc5ee42b833c7c9f3bcd24ba&chksmfa826d91cdf5e4872eb275e5319b66ba6927ea0074fb2293fe1ca47d6aedf38ab91050be484c&token1551213…