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

通过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查找ScheduledScheduled 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 = "[定时任务父类]";@Autowiredprivate ScheduledRepository scheduledRepository;@Autowiredprivate TaskScheduler threadPoolTaskScheduler;@Overridepublic 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 {@Overridepublic void childExec() {log.info("我被执行了当前时间为{}", new Date());}@Overridepublic String childGetCron() {return getTimeCron("myTask", getName(), "0 0/15 * * * ?");}@Overridepublic String getName() {return "我的定时任务";}
}

三.效果

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

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

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

相关文章

【C++数据结构】二叉搜索树(超详细图解操作过程,超详细讲解代码实现)

目录 01.二叉搜索树的概念 02.二叉搜索树的操作过程 03.二叉搜索树的代码实现 &#xff08;1&#xff09;基本框架 &#xff08;2&#xff09;树的创建与销毁 &#xff08;3&#xff09;元素的查找 &#xff08;4&#xff09;元素的插入 &#xff08;5&#xff09;元素的…

Day71 代码随想录打卡|回溯算法篇---全排列

题目&#xff08;leecode T46&#xff09;&#xff1a; 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 方法&#xff1a;全排列是数学中的基础问题&#xff0c;也是回溯算法能解决的经典问题。全排列因为每个元素都会…

卷积神经网络学习问题总结

问题一&#xff1a; 深度学习中的损失函数和应用场景 回归任务&#xff1a; 均方误差函数&#xff08;MSE&#xff09;适用于回归任务&#xff0c;如预测房价、预测股票价格等。 import torch.nn as nn loss_fn nn.MSELoss() 分类任务&#xff1a; 交叉熵损失函数&…

AI算法19-偏最小二乘法回归算法Partial Least Squares Regression | PLS

偏最小二乘法回归算法简介 算法概述 偏最小二乘法模型可分为偏最小二乘回归模型和偏最小二乘路径模型。其中偏最小二乘回归模型是一种新型的多元统计方法&#xff0c;它集中了主成分分析、典型相关分析和线性回归的特点&#xff0c;特别在解决回归中的共线性问题具有无可比拟…

PX4 运行 make px4_sitl_default gazebo 报错

报错原因&#xff1a;最开始我把依赖一直都是在base环境下安装的&#xff0c;没有conda deactivate&#xff0c;而pip install的东西应该装在系统环境&#xff0c;不能装在base环境下&#xff0c;sudo apt 是装在系统环境的 1.检查ros 用鱼香ros安装 wget http://fishros.…

日活2.5亿的Twitter 使用了哪些数据库?

Twitter 使用什么数据库存储用户每天发送的数亿条推文&#xff1f;是 SQL、NoSQL 还是其它持久化存储系统&#xff1f; Twitter 使用什么数据库&#xff1f; 任何一个稍微有点规模的系统其存储层绝不会只使用一种数据库&#xff0c;服务于数以亿计用户的Twitter更是如此。Twit…

《YOLOv10改进实战专栏》专栏介绍 专栏目录

《YOLOv10改进实战专栏》介绍及目录 YOLOv10官方仓库地址 专栏地址&#xff1a;点击跳转 专栏导航如下&#xff1a; &#x1f380;基础入门篇&#x1f380; 万字长文&#xff0c;小白新手怎么开始做YOLO实验&#xff0c;从零开始教&#xff01;整体思路在这里&#xff0c;科研指…

Vue学习---vue cli 项目创建

使用的编辑工具webStorm 创建例子: hello vue create hello 选择 vue3 进行创建 运行 npm run serve 测试访问&#xff1a;http://localhost:8080 改动内容重新编译&#xff1a; npm run build dist 目录就是编译后的可运行内容

浅谈C嘎嘎类与对象

本篇文章与大家浅谈一下C嘎嘎的类与对象知识点 类的定义 关键字&#xff1a;class 语法格式&#xff1a; class 类名 { }&#xff1b;//这里的分号不能少 此外&#xff0c;class有三个属性分别是private、public、protected&#xff0c;这三个属性是干啥的&#xff0c;相…

MSPM0G3507——时钟主频拉到80MHZ

先点开使用时钟树 在配置时钟界面这样配置

Ghost Browser指纹浏览器年+IPXProxy代理IP组合:SheIn卖家必看

SheIn是一家时尚电商公司&#xff0c;其用户数量近年来增长迅速&#xff0c;在全球的知名度越来越高。SheIn跨境电商卖家想要提升店铺曝光和排名&#xff0c;从而增加销量和信誉的话&#xff0c;就需要满足独立IP、模拟设备参数、独立环境等条件。同时满足这些条件的话就需要用…

生成式人工智能(AI)的未来

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

windows qt编译报错 无法打开包括文件: “EGL/egl.h”: No such file or directory

windows mingw32 qt creator QtAV 推荐ffmpeg依赖包 QT5.14.2 如果出现&#xff1a;无法打开包括文件: “EGL/egl.h”: No such file or directory 可能是Qt6的问题.在QT5上安装。 编译步骤&#xff1a; git clone https://github.com/wang-bin/QtAV.git cd QtAV &&…

【深度学习教程】

文章目录 pytorch官方教程知识蒸馏&#xff1a;https://pytorch.org/tutorials/beginner/knowledge_distillation_tutorial.html 李宏毅-机器学习/深度学习https://speech.ee.ntu.edu.tw/~hylee/ml/2021-spring.phphttps://speech.ee.ntu.edu.tw/~hylee/ml/2022-spring.phphttp…

最新Qt6的下载与成功安装详细介绍

引言 Qt6 是一款强大的跨平台应用程序开发框架&#xff0c;支持多种编程语言&#xff0c;最常用的是C。Qt6带来了许多改进和新功能&#xff0c;包括对C17的支持、增强的QML和UI技术、新的图形架构&#xff0c;以及构建系统方面的革新。本文将指导你如何在Windows平台上下载和安…

第五章:卷-将磁盘挂载到容器

本章内容包括&#xff1a; 创建多容器pod创建一个可在容器间共享磁盘存储的卷在pod中使用git仓库将持久性存储挂载到pod使用预先配置的持久性存储动态调配持久存储 在前面说过&#xff0c;pod类似逻辑主机&#xff0c;在逻辑主机中运行的进程共享如CPU、RAM、网络接口等资源&am…

一分钟了解什么是1U,2U服务器?

一、什么是1U&#xff0c;2U服务器&#xff1f; 什么是1U服务器呢&#xff1f;所谓的1U服务器就是一种高可用高密度的低成本服务器平台&#xff0c;U是服务器机箱的高度 1U等于4.45厘米 &#xff0c;那3U就是3x4.5CM了。 u(unit的缩略语)是一种表示组合式机架外部尺寸的单位&a…

【时时三省】tessy 集成测试:小白入门指导手册

目录 1,创建集成测试模块且分析源文件 2,设置测试环境 3,TIE界面设置相关函数 4,SCE界面增加用例 5,编辑数据 6,用例所对应的测试函数序列 7,添加 work task 函数 8,为测试场景添加函数 9,为函数赋值 10,编辑时间序列的数值 11,执行用例 12,其他注意事项…

【论文阅读】(StemGNN)多元时间序列预测的谱时间图神经网络

&#xff08;StemGNN&#xff09;Spectral Temporal Graph Neural Network for Multivariate Time-series Forecasting 引用&#xff1a; Cao D , Wang Y , Duan J ,et al.Spectral Temporal Graph Neural Network for Multivariate Time-series Forecasting[J]. 2021.DOI:10.…

DockerHub无法拉取镜像怎么办

快速构建企业级AIGC项目 LangChat是Java生态下企业级AIGC项目解决方案&#xff0c;在RBAC权限体系的基础上&#xff0c;集成AIGC大模型功能&#xff0c;帮助企业快速定制知识库、企业机器人。 网站文档&#xff1a;Index – LangChat 后台地址&#xff1a;LangChain Chat 前台…