Spring动态调用定时任务

Map<定时多久,List<方法>> map 动态定时任务

需求

使用一个结构来管理定时任务,其中每个时间间隔对应一组方法。这些方法需要在指定的时间间隔内执行。具体来说,维护一个 Map,键是定时的间隔(以秒为单位),值是需要在这些间隔内执行的方法列表。

解决方案

  1. 定义一个 TaskScheduler,它可以维护一个 Map<Long, List<Runnable>>,其中 Long 是间隔时间(秒),List<Runnable> 是在该时间间隔内执行的方法列表。
  2. 动态调度任务,根据时间间隔启动定时任务,并确保每个时间间隔内的所有方法都能被执行。

代码实现

1. DynamicTaskScheduler.java - 动态调度类
package com.example.scheduler;import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import java.util.*;
import java.util.concurrent.ScheduledFuture;@Component
public class DynamicTaskScheduler {private final ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();private final Map<Long, List<Runnable>> tasksMap = new HashMap<>();private final Map<Long, ScheduledFuture<?>> scheduledTasks = new HashMap<>();@PostConstructpublic void init() {taskScheduler.setPoolSize(5); // 设定线程池大小taskScheduler.initialize();}// 添加任务到指定时间间隔public void addTask(long intervalInSeconds, Runnable task) {tasksMap.computeIfAbsent(intervalInSeconds, k -> new ArrayList<>()).add(task);}// 启动所有定时任务public void startAllTasks() {for (Map.Entry<Long, List<Runnable>> entry : tasksMap.entrySet()) {long interval = entry.getKey();List<Runnable> tasks = entry.getValue();// 取消已有任务if (scheduledTasks.containsKey(interval) && scheduledTasks.get(interval) != null) {scheduledTasks.get(interval).cancel(true);}// 启动新的定时任务ScheduledFuture<?> futureTask = taskScheduler.scheduleAtFixedRate(() -> {for (Runnable task : tasks) {task.run();}}, interval * 1000L);scheduledTasks.put(interval, futureTask);}}// 停止所有定时任务public void stopAllTasks() {for (ScheduledFuture<?> futureTask : scheduledTasks.values()) {if (futureTask != null) {futureTask.cancel(true);}}scheduledTasks.clear();}
}
2. TaskRunner.java - 启动类,模拟任务添加和调度
package com.example.scheduler;import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;@Component
public class TaskRunner implements CommandLineRunner {private final DynamicTaskScheduler dynamicTaskScheduler;public TaskRunner(DynamicTaskScheduler dynamicTaskScheduler) {this.dynamicTaskScheduler = dynamicTaskScheduler;}@Overridepublic void run(String... args) throws Exception {// 添加不同时间间隔的任务dynamicTaskScheduler.addTask(5, () -> System.out.println("任务1 执行:" + System.currentTimeMillis()));dynamicTaskScheduler.addTask(10, () -> System.out.println("任务2 执行:" + System.currentTimeMillis()));// 启动所有任务dynamicTaskScheduler.startAllTasks();// 等待一段时间后停止任务Thread.sleep(30000);  // 等待30秒dynamicTaskScheduler.stopAllTasks();}
}
3. DemoApplication.java - Spring Boot 启动类
package com.example.scheduler;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

解释

  1. DynamicTaskScheduler:

    • 使用 Map<Long, List<Runnable>> 来维护每个时间间隔对应的任务列表。
    • addTask(long intervalInSeconds, Runnable task) 方法用于将任务添加到指定的时间间隔中。
    • startAllTasks() 方法启动所有时间间隔内的任务,并确保每个时间间隔的任务都被调度。
    • stopAllTasks() 方法取消所有当前运行的定时任务。
  2. TaskRunner:

    • 在应用启动时,模拟添加任务并设置它们的执行时间。
    • 启动所有任务并等待一段时间后停止它们。

这样,你可以通过维护一个 Map 来动态添加、更新和启动定时任务。每个时间间隔对应一组任务,所有这些任务会在相应的时间间隔内执行。

如果更好的方式可以在评论区留言讨论~~~

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

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

相关文章

机器学习之监督学习(三)神经网络

机器学习之监督学习&#xff08;三&#xff09;神经网络基础 0. 文章传送1. 深度学习 Deep Learning深度学习的关键特点深度学习VS传统机器学习 2. 生物神经网络 Biological Neural Network3. 神经网络模型基本结构模块一&#xff1a;TensorFlow搭建神经网络 4. 反向传播梯度下…

开源的 Windows 12 网页体验版!精美的 UI 设计、丰富流畅的动画

大家周二好呀&#xff01;博主今天给小伙伴们分享一款炫酷的 Windows 12 体验版&#xff0c;网页效果拉满&#xff0c;非常值得我们去尝试&#xff01; 如果你对未来的Windows操作系统充满期待&#xff0c;那么这款开源的Windows 12 网页体验版绝对不容错过&#xff01;这不仅…

consul配置ACL安全认证

文章目录 前言一、漏洞详情二、漏洞处理1.ACL相关介绍2.开启ACL3.创建令牌4.修改acl文件5.修改单节点consul启动配置文件6.重启consul 三、漏洞处理结果验证 前言 因为现阶段属于护网期,因此公司对服务器、业务的安全都很关注,只要再次期间被漏扫出来的漏洞&#xff0c;都需要…

tomcat是不是已经被Springboot集成了?

Tomcat 确实已经被 Spring Boot 集成。Spring Boot 通过其独特的“starter”模块&#xff08;如spring-boot-starter-web&#xff09;实现了对Tomcat的自动配置。当在Spring Boot项目中引入这个starter时&#xff0c;会自动引入相关的依赖&#xff0c;包括tomcat-embed-core、t…

C语言补习课——文件篇

来源&#xff1a;黑马程序员 第157讲 C语言操作文件概述 读取文件&#xff1a;输入流 写文件&#xff1a;输出流 读写的方向判断取决与参照&#xff0c;一般我们站在程序的角度判断读写方向。 第158讲 路径 基本概念 路径就是指文件在电脑中的位置&#xff0c;eg&#xf…

阿里旗下土耳其电商Trendyol计划进军欧洲市场

阿里旗下土耳其电商Trendyol计划进军欧洲市场 近年来&#xff0c;阿里巴巴集团在全球电商领域的布局持续深化&#xff0c;其旗下土耳其电商巨头Trendyol更是凭借其出色的市场表现和强劲的增长势头&#xff0c;成为了备受瞩目的焦点。近日&#xff0c;Trendyol宣布了一项重要战…

Java初步

背景 名字 Oak&#xff08;橡树&#xff09;改到一个岛&#xff08;疑似盛产咖啡&#xff09; Java之父 詹姆斯高斯林&#xff08;James Gosling&#xff09; sun公司研发 现在属于Oracle公司 把它称为甲骨文公司 应用 企业级应用开发 重点学习JavaSE&#xff08;Standa…

Spring Boot集成Mockito快速入门Demo

1.什么是Mockito&#xff1f; Mockito是一个模拟测试框架&#xff0c;可以让你用优雅&#xff0c;简洁的接口写出漂亮的单元测试。Mockito可以让单元测试易于可读&#xff0c;产生简洁的校验错误。 使用场景 提前创建测试&#xff0c;TDD&#xff08;测试驱动开发&#xff0…

线性代数 第六讲 特征值和特征向量_相似对角化_实对称矩阵_重点题型总结详细解析

文章目录 1.特征值和特征向量1.1 特征值和特征向量的定义1.2 特征值和特征向量的求法1.3 特征值特征向量的主要结论 2.相似2.1 相似的定义2.2 相似的性质2.3 相似的结论 3.相似对角化4.实对称矩阵4.1 实对称矩阵的基本性质4.2 施密特正交化 5.重难点题型总结5.1 判断矩阵能否相…

C#中的字段和属性

字段和属性 字段和属性的基础介绍 类拥有成员变量和成员方法 成员变量就是字段&#xff0c;用于存储对象的信息 public string name; //公共字段private int age; //私有字段可以给成员变量设置其内部的get/set方法&#xff0c;操作获取或设置成员时的操作。 internal cla…

JavaScript高级——函数中的this

1、this是什么&#xff1f; ① 任何函数本质上都是通过某个对象来调用的&#xff0c;如果没有直接指定就是 window 。 ② 所有函数内部都有一个变量 this 。 ③ 它的值是调用函数的当前对象。 2、如何确定 this 的值&#xff1f; ① test&#xff08;&#xff09;&#xff…

如何进行DAP-seq的数据挖掘,筛选验证位点

从样本准备到寄送公司&#xff0c;每一天都在“祈祷”有个心仪的分析结果&#xff0c;终于在这天随着邮件提示音的响起&#xff0c;收到了分析结果...... 分析前工作 爱基在进行数据分析之前&#xff0c;会有两次质控报告反馈给老师们。第一个&#xff0c;基因组DNA的提取质控…

springBoot 集成https

springBoot 集成https 1、springBoot默认的证书格式 pring Boot 需要 .p12 或 .jks 格式的证书。如果你只有 .pem 和 .key 文件&#xff0c;可以使用 openssl 工具将它们转换成 .p12 文件 2、转换.p12 我的证书文件如下&#xff0c;需要转换 2.1 下载openssl https://slpr…

苹果手机铃声怎么设置自己的歌?3个方法自定义手机铃声

苹果手机内部的手机铃声库只有固定的几首铃声&#xff0c;且都是纯音乐&#xff0c;比较单调&#xff0c;并不是所有用户都喜欢这些铃声。那么&#xff0c;苹果手机铃声怎么设置自己的歌呢&#xff1f;小编这里有3个方法&#xff0c;可以教大家如何将手机铃声设置成自己喜欢的歌…

MongoDB 的适用场景

MongoDB 的适用场景 MongoDB 是一种基于文档存储的 NoSQL 数据库&#xff0c;与传统的关系型数据库不同&#xff0c;它使用 JSON 类似的二进制文档格式&#xff08;BSON&#xff09;来存储数据&#xff0c;并且具备灵活的文档模型、强大的查询能力和水平扩展性。这些特性使得 …

Java 入门指南:Java 并发编程 —— 同步工具类 Semephore(信号量)

文章目录 同步工具类Semephore核心功能限制并发访问量公平与非公平策略灵活性与适应性 常用方法使用示例 同步工具类 JUC&#xff08;Java.util.concurrent&#xff09;是 Java 提供的用于并发编程的工具类库&#xff0c;其中包含了一些通信工具类&#xff0c;用于在多个线程之…

C语言-综合案例:通讯录

传送门&#xff1a;C语言-第九章-加餐&#xff1a;文件位置指示器与二进制读写 目录 第一节&#xff1a;思路整理 第二节&#xff1a;代码编写 2-1.通讯录初始化 2-2.功能选择 2-3.增加 和 扩容 2-4.查看 2-5.查找 2-6.删除 2-7.修改 2-8.退出 第三节&#xff1a;测试 下期…

【单片机开发】单片机常用开发工具

【前言】 在嵌入式系统领域&#xff0c;单片机&#xff08;Microcontroller, MCU&#xff09;作为核心组件&#xff0c;广泛应用于智能家居、工业控制、汽车电子等众多领域。而单片机开发工具&#xff0c;则是开发者们实现创意、解决问题的重要助手。本文主要讲述目前主流的单…

港科夜闻 | 叶玉如校长出席2024科技+新质生产力高峰论坛发表专题演讲,贡献国家科技强国战略...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、叶玉如校长出席“2024科技新质生产力高峰论坛”&#xff0c;做了题为“三个创新&#xff1a;培育和发展新质生产力、贡献国家科技强国战略”的主题演讲。该论坛于9月2日在香港召开。论坛围绕夯实基础科研、推动源头创新、…

axure判断

在auxre中我们也可以实现判断的功能&#xff0c;当目标等于什么内容时则执行下方的功能。 一、判断输入框中是否有值 画布添加一个输入框、一个文本标签删除其中内容&#xff0c;添加一个按钮&#xff0c;输入框命名为【文本显示】文本标签命名为【提示】 给按钮新增一个交互…