简单两步,Spring Boot 定时任务也能动态设置

在Spring Boot项目中实现定时任务通常涉及到使用@Scheduled注解,这种方式简单直接,但往往存在一个问题:一旦应用启动,定时任务的执行时间和频率就被固定下来了,难以在不重启应用的情况下进行动态调整。为了实现Spring Boot定时任务的动态设置,我们可以通过结合使用Spring的TaskScheduler接口和数据库(或配置中心)来实现。下面将通过一个简单的例子来展示如何分两步实现动态定时任务。

第一步:配置TaskScheduler

首先,我们需要配置一个TaskScheduler的Bean,这个Bean将用于动态地调度任务。Spring Boot已经为我们提供了ThreadPoolTaskScheduler的实现,我们可以直接使用它。

import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;  @Configuration  
public class SchedulerConfig {  @Bean  public ThreadPoolTaskScheduler taskScheduler() {  ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();  // 可以根据需要配置线程池的大小、线程名称前缀等  scheduler.setPoolSize(10);  scheduler.setThreadNamePrefix("scheduled-task-");  scheduler.setDaemon(true);  return scheduler;  }  
}

第二步:创建动态调度任务

接下来,我们需要创建一个可以动态注册和取消的定时任务。这通常涉及到使用TaskSchedulerschedule方法来安排任务,以及使用返回的ScheduledFuture来取消任务。

首先,定义一个服务类来管理这些任务:

import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.scheduling.TaskScheduler;  
import org.springframework.scheduling.support.CronTrigger;  
import org.springframework.stereotype.Service;  import java.util.concurrent.ScheduledFuture;  @Service  
public class DynamicScheduledTaskService {  @Autowired  private TaskScheduler taskScheduler;  private ScheduledFuture<?> futureTask;  // 动态启动任务  public void startTask(String cronExpression) {  // 假设有一个Runnable任务实现  Runnable task = () -> System.out.println("Executing task at " + System.currentTimeMillis());  // 取消之前的任务(如果有)  if (futureTask != null) {  futureTask.cancel(false);  }  // 使用新的cron表达式启动任务  futureTask = taskScheduler.schedule(task, new CronTrigger(cronExpression));  }  // 取消任务  public void cancelTask() {  if (futureTask != null) {  futureTask.cancel(false);  futureTask = null;  }  }  
}

使用示例

现在,你可以通过调用DynamicScheduledTaskServicestartTaskcancelTask方法来动态地启动和取消定时任务了。例如,你可以通过REST API或者管理界面来触发这些操作,从而在不重启应用的情况下修改定时任务的执行频率。

@RestController  
@RequestMapping("/api/tasks")  
public class TaskController {  @Autowired  private DynamicScheduledTaskService taskService;  @PostMapping("/start")  public ResponseEntity<?> startTask(@RequestParam String cronExpression) {  taskService.startTask(cronExpression);  return ResponseEntity.ok("Task started with cron expression: " + cronExpression);  }  @PostMapping("/cancel")  public ResponseEntity<?> cancelTask() {  taskService.cancelTask();  return ResponseEntity.ok("Task cancelled");  }  
}

结论

通过以上两步,我们成功地在Spring Boot应用中实现了定时任务的动态设置。这种方法使得我们可以根据业务需求灵活地调整任务的执行时间和频率,提高了应用的灵活性和可维护性。需要注意的是,动态调整定时任务时要确保线程安全和资源释放,避免造成内存泄漏或其他问题。

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

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

相关文章

【动态规划】最长回文子串

最长回文子串&#xff08;难度&#xff1a;中等&#xff09; 该题对应力扣网址 思路 题目分成三种情况 情况一&#xff1a;每一个字符都是长度为1的回文串 情况二&#xff1a;长度大于2的回文串&#xff1a;看从i到j的字符串包含的从i1到j-1的字符串是否是回文串&#xff08…

关于液氮罐的液氮补给方式

液氮用于低温保存生物样本&#xff0c;如细胞、组织和其他样品&#xff0c;确保其长期存储而不失活。当液氮罐中的液氮水平下降时&#xff0c;及时补给是至关重要的。补给液氮的步骤较为简单&#xff0c;但需要遵循一定的安全标准和操作规范&#xff0c;以确保样本的安全和液氮…

数据治理005-血缘关系

数据血缘是元数据产品的核心能力&#xff0c;但数据血缘是典型的看起来很美好但用起来门槛很高的技术&#xff0c;只要你采买过元数据产品就知道了。这篇文章对数据血缘的特征、价值、用途和方法做了系统阐述&#xff1a; 1、特征&#xff1a;归属性、多源性、可追溯及层次性 2…

2022年上真题(案例分析)

一、数据流图 1. E1&#xff1a;商户 E2&#xff1a;外卖平台 E3&#xff1a;用户 E4&#xff1a;支付系统 2. D1&#xff1a;商户用户信息表 D2&#xff1a;订单表 D3&#xff1a;餐品信息表 D4&#xff1a;评价表 3. 数据流名称 …

Python Daphne库:ASGI服务的高效Web服务器

更多Python学习内容&#xff1a;ipengtao.com 随着 Web 开发技术的不断发展&#xff0c;异步编程逐渐成为构建高性能 Web 应用的主流方式。传统的 WSGI 接口已经不能满足现代异步 Web 应用的需求。ASGI&#xff08;Asynchronous Server Gateway Interface&#xff09;作为 WSGI…

智慧园区建设,构建智能监控和安防体系

智慧园区是指运用先进的信息技术和互联网思维&#xff0c;以提升园区管理和服务水平为目标&#xff0c;通过整合各类资源、优化园区运营&#xff0c;打造智能化、智能、绿色、低碳的现代园区。在智慧园区中&#xff0c;智慧楼宇、智能监控、智慧消防和智慧安防是不可或缺的重要…

项目实战:k8s部署考试系统

一、新建nfs服务器&#xff08;192.168.1.44&#xff09; 1.基础配置&#xff08;IP地址防火墙等&#xff09; 2.配置时间同步 [rootlocalhost ~]# yum -y install ntpdate.x86_64 [rootlocalhost ~]# ntpdate time2.aliyun.com 27 Sep 10:28:08 ntpdate[1634]: adjust tim…

机器学习-KNN

KNN&#xff1a;K最邻近算法&#xff08;K-Nearest Neighbor,KNN&#xff09; 用特征空间中距离待分类对象的最近的K个样例点的类别来预测。 投票法&#xff1a;K 个样例的对数类别。 k1:最近邻分类 k 通常是奇数&#xff08;因为我们根据这个K数据判断类别&#xff0c;如果…

基于Hive和Hadoop的保险分析系统

本项目是一个基于大数据技术的保险分析系统&#xff0c;旨在为用户提供全面的汽车保险信息和深入的保险价格分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xff0c;以 Spark…

简单顺序计算器

C语言题目&#xff1a;简单顺序计算器&#xff0c;用python代码解。 (笔记模板由python脚本于2024年09月27日 22:58:16创建&#xff0c;本篇笔记适合喜欢python的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖…

相机的内参 外参

相机的内参和外参是计算机视觉和摄影测量中的重要概念。以下是对它们的详细说明&#xff1a; 内参&#xff08;Intrinsic Parameters&#xff09; 内参定义了相机的内部特性&#xff0c;主要包括焦距、主点坐标以及畸变系数。内参矩阵 K 形式如下&#xff1a; 外参&#xf…

JS数据类型类型转换

基本数据类型 JS中的数据类型由原始值和对象共同组成&#xff0c;原始值一共有七种原始值&#xff1a; 数值(Number)大整数(BigInt)字符串(String)布尔值(Boolean)空值(Null)未定义(Undefined)符号(Symbol) 数值和大整数 数值(Number):在js中所有的整数和浮点数都是number类型 …

【含文档】基于Springboot+微信小程序 的中心医院用户移动端(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

[C++]栈队列改成模板类

栈、队列都更改成模板类 栈 .hpp #ifndef MY_STACK_H #define MY_STACK_H #include <iostream>using namespace std;template<typename T> class my_stack { private:T *base;//动态栈指针int top;//栈顶元素int size;//栈大小 public:my_stack();//无参构造my_…

【工具类】证书自动续签免费版 正式发布

证书自动续签免费版 正式发布 1.控制台首页2.申请证书2.1.支持自动解析和手动解析两种模式2.2.LB&#xff08;负载均衡&#xff09;支持主流的云厂商2.3.CDN&#xff08;内容分发&#xff09; 支持主流的云厂商2.4.对象存储&#xff08;OSS&#xff09;支持主流云厂商2.5DCDN&a…

Linux云计算 |【第四阶段】RDBMS1-DAY2

主要内容&#xff1a; 常用函数&#xff08;函数分类1&#xff1a;单行、分组&#xff1b;函数分类2&#xff1a;字符、数学、日期、流程控制&#xff09;、分组查询group by、连接查询 一、常用函数 1. 按使用方式分类 ① 单行函数 单行函数&#xff08;Scalar Functions&…

manim页面中不规则分割整个人页面。

界面中的分割方式 在信息设计中&#xff0c;我们常常需要通过分割设计的方式来对信息进行分组&#xff0c;界面中的分割方式大致分为三种&#xff1a;卡片、线条、留白。 界面中的分割方式主要可以分为以下几种&#xff1a; 一、根据规则进行分割&#xff1a; 规则网格分割&…

游戏如何对抗改包

游戏改包是指通过逆向分析手段及修改工具&#xff0c;来篡改游戏包内正常的设定和规则的行为&#xff0c;游戏包被篡改后&#xff0c;会被植入/剔除模块进行重打包。 本期图文我们将通过实际案例分析游戏改包的原理&#xff0c;并分享游戏如何应对改包问题。 安卓平台常见的改…

大数据的挑战是小文件

小文件可能会给存储平台及其支持的应用程序带来大问题。在 Google 上搜索 “small files performance” 会产生 2M 的结果。这篇博文将更深入地研究小文件问题&#xff0c;深入研究其根源并总结解决方案。 问题陈述 出于本讨论的目的&#xff0c;小文件通常被视为小于 64 KB …

蓝桥杯【物联网】零基础到国奖之路:十二. TIM

蓝桥杯【物联网】零基础到国奖之路:十二. TIM 第一节 理论知识第二节 cubemx配置 第一节 理论知识 STM32L071xx器件包括4个通用定时器、1个低功耗定时器&#xff08;LPTIM&#xff09;、2个基本定时器、2个看门狗定时器和SysTick定时器。 通用定时器&#xff08;TIM2、TIM3、…