当前位置: 首页 > news >正文

java spring boot 动态添加 cron(表达式)任务、动态添加停止单个cron任务

java spring boot 动态添加 cron(表达式)任务、动态添加停止单个cron任务

  1. 添加对应的maven
        <dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.0</version></dependency>
  2.  添加一个工具类  SchedulerManager 
    import org.quartz.Scheduler;
    import org.quartz.SchedulerException;
    import org.quartz.SchedulerFactory;
    import org.quartz.impl.StdSchedulerFactory;public class SchedulerManager {private static Scheduler scheduler;// 初始化 Scheduler public static void initScheduler() throws SchedulerException {SchedulerFactory schedulerFactory = new StdSchedulerFactory();scheduler = schedulerFactory.getScheduler();// 为了方便直接创建后启用scheduler.start();}// 使用同步块确保线程安全public static Scheduler getScheduler() {if (scheduler == null) {synchronized (SchedulerManager.class) {if (scheduler == null) {  // 双重检查try {initScheduler();} catch (SchedulerException e) {// 处理异常或抛出自定义异常e.printStackTrace();}}}}return scheduler;}// 启动 scheduler public static void start() {try {if (!scheduler.isStarted()) {scheduler.start();}} catch (SchedulerException e) {// 处理异常或抛出自定义异常e.printStackTrace();}}// 暂停任务/删除任务public static void stopTask(String jobKey) {try {Scheduler scheduler = SchedulerManager.getScheduler();JobKey key = new JobKey(jobKey, jobKey);JobDetail jobDetail = scheduler.getJobDetail(key);if (jobDetail != null) {// 获取JobDataMapJobDataMap dataMap = jobDetail.getJobDataMap();dataMap.put("ok", false);// 暂停任务scheduler.pauseJob(key);// 或者删除当前任务// scheduler.deleteJob(key);}} catch (SchedulerException e) {e.printStackTrace();}}// 恢复任务public static int startTask(String jobKey) {int o = 0;try {Scheduler scheduler = SchedulerManager.getScheduler();JobKey key = new JobKey(jobKey, jobKey);JobDetail jobDetail = scheduler.getJobDetail(key);if (jobDetail != null) {// 获取JobDataMapJobDataMap dataMap = jobDetail.getJobDataMap();dataMap.put("ok", true);// 恢复任务scheduler.resumeJob(key);o = 1;}} catch (SchedulerException e) {e.printStackTrace();}finally {return o;}}/*** 停止所有任务*/public static void stopAllTask() {try {Scheduler scheduler = context.getScheduler();try {// 停止调度器scheduler.shutdown();} catch (SchedulerException e) {logger.error("停止调度器时出错", e);throw new JobExecutionException("停止调度器时出错", e);}} catch (SchedulerException e) {e.printStackTrace();}}}
  3. 添加cron执行任务类
    import lombok.extern.slf4j.Slf4j;
    import org.quartz.*;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    import org.springframework.stereotype.Service;import java.text.SimpleDateFormat;
    import java.util.Date;@Component
    @Slf4j
    @Service
    public class CronThread implements Job {private final static Logger logger = LoggerFactory.getLogger(MediaServerServiceImpl.class);// 详情idString detailId = "";// 启用/停用(双重保险)boolean ok = true;// 设备idint facilityId = -1;public void setOK(boolean ok) {this.ok = ok;}@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {try {JobDataMap dataMap = context.getJobDetail().getJobDataMap();this.ok = dataMap.getBoolean("ok");if (ok){this.detailId = dataMap.getString("detailId");this.facilityId = dataMap.getInt("facilityId");logger.info("任务执行: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "。key=" + context.getJobDetail().getKey());frameSave();}} catch (Exception e) {logger.error("执行任务异常,内容", e);logger.info("停止任务:{}",context.getJobDetail().getKey());Scheduler scheduler = context.getScheduler();try {// 暂停当前任务
    //                scheduler.pauseJob(context.getJobDetail().getKey());// 或者删除当前任务scheduler.deleteJob(context.getJobDetail().getKey());} catch (SchedulerException s) {logger.error("暂停或删除任务时出错", s);throw new JobExecutionException("暂停或删除任务时出错", s);}}}public void frameSave() {try {logger.info("执行任务");} catch (Exception e) {logger.error("执行异常,内容: ", e);}}
    }
    
  4. 启动/使用 方式
        // 启动全部public void startAllTasks(List<Map<String,Object>> mapList){// 获取schedulerScheduler scheduler = SchedulerManager.getScheduler();for (Map<String, Object> map : mapList) {try {// 像任务执行类传入参数JobDataMap jobDataMap = new JobDataMap();jobDataMap.put("detailId", map.get("detailId").toString());jobDataMap.put("facilityId", (int) map.get("detailId"));jobDataMap.put("ok", true);// 任务唯一标识 根据情况来定,后续停止或启用单个的时候需要用到该唯一值String key = map.get("detailId").toString() + "-" + map.get("facilityId").toString();//    上面创建的  cron 执行任务类JobDetail jobDetail = JobBuilder.newJob(CronThread.class).withIdentity(key, key).setJobData(jobDataMap).build();Trigger trigger = TriggerBuilder.newTrigger().withIdentity(key, key).withSchedule(CronScheduleBuilder.cronSchedule(map.get("cronStr").toString()))      //cron表达式.build();// 添加任务 到时间后会自动调用(在上面获取scheduler时里面有启动的操作)scheduler.scheduleJob(jobDetail, trigger);} catch (Exception e){e.printStackTrace();logger.error("启动抽帧任务报错:: ", e);}}}// 停止单个任务public void stopOneTask(String detailId,int facilityId){// 任务唯一标识String key = detailId + "-" + facilityId;SchedulerManager.stopTask(key);}// 启动单个任务public int startOneTask(String detailId,int facilityId,String cronStr){// 任务唯一标识String key = detailId + "-" + facilityId;int i = PollingAlgorithmCron.startTask(detailId + "-" + facilityId);if (i == 0) {// 该任务已被删除 重新添加try {// 可以将下面代码封装成一个方法,否则会和上面启动全部任务的操作代码重复JobKey jobKey = new JobKey(key, key);Scheduler scheduler = SchedulerManager.getScheduler();if (scheduler.checkExists(jobKey)) {return 1;}JobDataMap jobDataMap = new JobDataMap();jobDataMap.put("detailId", detailId);jobDataMap.put("facilityId", facilityId);jobDataMap.put("ok", true);JobDetail jobDetail = JobBuilder.newJob(CronThread.class).withIdentity(key, key).setJobData(jobDataMap).build();Trigger trigger = TriggerBuilder.newTrigger().withIdentity(key, key).withSchedule(CronScheduleBuilder.cronSchedule(cronStr)).build();scheduler.scheduleJob(jobDetail, trigger);return 1;} catch (SchedulerException e) {// 处理调度器异常e.printStackTrace();logger.error("One Scheduler exception: ", e);return 0;}}return 0;}

相关文章:

java spring boot 动态添加 cron(表达式)任务、动态添加停止单个cron任务

java spring boot 动态添加 cron&#xff08;表达式&#xff09;任务、动态添加停止单个cron任务 添加对应的maven <dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.0</version…...

sqlgun靶场漏洞挖掘

1.xss漏洞 搜索框输入以下代码&#xff0c;验证是否存在xss漏洞 <script>alert(1)</script> OK了&#xff0c;存在xss漏洞 2.SQL注入 经过测试&#xff0c;输入框存在SQL注入漏洞 查询数据库名 查询管理员账号密码 此处密码为MD5加密&#xff0c;解码内容如下 找…...

好用的 Markdown 编辑器组件

ByteMD bytedance/bytemd: ByteMD v1 repository (github.com) 这里由于我的项目是 Next&#xff0c;所以安装 bytemd/react&#xff0c; 阅读官方文档&#xff0c;执行命令来安装编辑器主体、以及 gfm&#xff08;表格支持&#xff09;插件、highlight 代码高亮插件&#xf…...

uniapp vite3 require导入commonJS 的js文件方法

vite3 导入commonJS 方式导出 在Vite 3中&#xff0c;你可以通过配置vite.config.js来实现导入CommonJS&#xff08;CJS&#xff09;风格的模块。Vite 默认支持ES模块导入&#xff0c;但如果你需要导入CJS模块&#xff0c;可以使用特定的插件&#xff0c;比如originjs/vite-pl…...

通义灵码用户说:“人工编写测试用例需要数十分钟,通义灵码以毫秒级的速度生成测试代码,且准确率和覆盖率都令人满意”

通过一篇文章&#xff0c;详细跟大家分享一下我在使用通义灵码过程中的感受。 一、定义 通义灵码&#xff0c;是一个智能编码助手&#xff0c;它基于通义大模型&#xff0c;提供代码智能生成、研发智能问答能力。 在体验过程中有任何问题均可点击下面的连接前往了解和学习。 …...

MySQL中的约束

约束概述 1.1 为什么需要约束 数据完整性&#xff08;Data Integrity&#xff09;是指数据的精确性&#xff08;Accuracy&#xff09;和可靠性&#xff08;Reliability&#xff09;。它是防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信…...

Leetcode 寻找重复数

可以使用 位运算 来解决这道题目。使用位运算的一个核心思想是基于数字的二进制表示&#xff0c;统计每一位上 1 的出现次数&#xff0c;并与期望的出现次数做比较。通过这种方法&#xff0c;可以推断出哪个数字重复。 class Solution { public:int findDuplicate(vector<i…...

大一新生以此篇开启你的算法之路

各位大一计算机萌新们&#xff0c;你们好&#xff0c;本篇博客会带领大家进行算法入门&#xff0c;给各位大一萌新答疑解惑。博客文章略长&#xff0c;可根据自己的需要观看&#xff0c;在博客中会有给大一萌新问题的解答&#xff0c;请不要错过。 入门简介&#xff1a; 算法…...

【AI大模型】ChatGPT模型原理介绍(上)

目录 &#x1f354; 什么是ChatGPT&#xff1f; &#x1f354; GPT-1介绍 2.1 GPT-1模型架构 2.2 GPT-1训练过程 2.2.1 无监督的预训练语言模型 2.2.2 有监督的下游任务fine-tunning 2.2.3 整体训练过程架构图 2.3 GPT-1数据集 2.4 GPT-1模型的特点 2.5 GPT-1模型总结…...

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达深度摄像机的仿真小车&#xff0c;并使用通过跨平台的方式进行ROS2和UE5仿真的通讯&#xff0c;达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础&#xff0c;Nav2相关的学习教程可以参考本人的其他博…...

C++竞赛初阶L1-15-第六单元-多维数组(34~35课)557: T456507 图像旋转

题目内容 输入一个 n 行 m 列的黑白图像&#xff0c;将它顺时针旋转 90 度后输出。 输入格式 第一行包含两个整数 n 和 m&#xff0c;表示图像包含像素点的行数和列数。1≤n≤100&#xff0c;1≤m≤100。 接下来 n 行&#xff0c;每行 m 个整数&#xff0c;表示图像的每个像…...

无线领夹麦克风哪个牌子好?西圣、罗德、猛犸领夹麦克风深度评测

​如今短视频和直播行业蓬勃发展&#xff0c;无线领夹麦克风成为了许多创作者不可或缺的工具。然而&#xff0c;市场上的无线领夹麦克风品牌众多、质量参差不齐&#xff0c;为了帮助大家挑选到满意的产品&#xff0c;我作为数码测评博主&#xff0c;对无线领夹麦克风市场进行了…...

React Native 0.76,New Architecture 将成为默认模式,全新的 RN 来了

关于 React Native 的 New Architecture 概念&#xff0c;最早应该是从 2018 年 RN 团队决定重写大量底层实现开始&#xff0c;因为那时候 React Native 面临各种结构问题和性能瓶颈&#xff0c;最终迫使 RN 团队开始进行重构。 而从 React Native 0.68 开始&#xff0c;New A…...

Java并发:互斥锁,读写锁,Condition,StampedLock

3&#xff0c;Lock与Condition 3.1&#xff0c;互斥锁 3.1.1&#xff0c;可重入锁 锁的可重入性&#xff08;Reentrant Locking&#xff09;是指在同一个线程中&#xff0c;已经获取锁的线程可以再次获取该锁而不会导致死锁。这种特性允许线程在持有锁的情况下&#xff0c;可…...

客户端负载均衡Ribbon实例

文章目录 一&#xff0c;概述二&#xff0c;实现过程三&#xff0c;项目源码1. 源码放送&#xff1a;2. 部署方式 四&#xff0c;功能演示五&#xff0c;其他 一&#xff0c;概述 一般来说&#xff0c;提到负载均衡&#xff0c;大家一般很容易想到浏览器 -> NGINX -> 反…...

MySQL数据库负载均衡

数据库负载均衡是通过将数据库请求分散到多个数据库服务器上&#xff0c;以提高数据库的处理能力和可用性。在高并发的场景下&#xff0c;使用数据库负载均衡器可以有效避免单点故障&#xff0c;提高系统的整体性能和可靠性。 数据库负载均衡器 数据库负载均衡器可以是硬件设…...

达梦CASE_SENSITIVE参数解析

1. 参数含义 标识符大小写敏感&#xff0c;默认值为 Y。 当大小写敏感时&#xff0c;小写的标识符应用双引号括起&#xff0c;否则被转换为大写&#xff1b;当大小写不敏感时&#xff0c;系统不自动转换标识符的大小写&#xff0c;在标识符比较时也不区分大小写。 CASE_SENS…...

酒店智能轻触开关工作原理

在现代化酒店中&#xff0c;智能轻触开关已成为提升宾客居住体验的重要设备之一。这些开关不仅操作便捷&#xff0c;而且功能丰富&#xff0c;能够实现对灯光、窗帘、空调等设备的精准控制。本文将深入探讨酒店智能轻触开关的工作原理。 一、智能轻触开关的基本概念 智能轻触开…...

web基础之RCE

简介&#xff1a;RCE称为远程代码执行漏洞&#xff1b;是互联网的一种安全漏洞&#xff1b;攻击者可以直接向后台服务器远程注入操作系统命令&#xff1b;从而操控后台系统&#xff1b;也是CTF比较常考的一个方面 1、eval执行 &#xff08;1&#xff09;分析后端代码&#xf…...

c语言--水仙花数,求Sn的前五项和

用C语言实现输出水仙花数 什么是“水仙花数”&#xff1f; 所谓“水仙花数”是指一个n位数&#xff0c;其各位数字n次方之和等于该数本身。 例如&#xff1a;1531 ^3 5 ^3 3 ^3 如何求解水仙花数&#xff1f; 思路&#xff1a; 步骤1&#xff1a;先计算出数i的位数&#x…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...