基于quartz,刷新定时器的cron表达式

文章目录

  • 前言
    • 基于quartz,刷新定时器的cron表达式
      • 1. 先看一下测试效果
      • 2. 实现代码

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


基于quartz,刷新定时器的cron表达式

1. 先看一下测试效果

因为这个我是基于quartz里面部分功能做的自定义分布式定时器框架,因此,关于定时器的实现可以略过,下面是我这个测试任务定时器的定义,看看就好。

    @Bean(name = "testFourTaskDetail")public JobDetail testFourTaskDetail(MyTask myTask) throws ClassNotFoundException, NoSuchMethodException {MethodInvokingJobDetailFactoryBean jobDetailFactoryBean = new MethodInvokingJobDetailFactoryBean();jobDetailFactoryBean.setConcurrent(Boolean.TRUE);jobDetailFactoryBean.setName("testFourTask");jobDetailFactoryBean.setTargetObject(myTask);jobDetailFactoryBean.setTargetMethod("testFourTask");jobDetailFactoryBean.afterPropertiesSet();return jobDetailFactoryBean.getObject();}//定时触发器@Bean(name = "testFourTaskTrigger")public CronTriggerFactoryBean testFourTaskTrigger(@Qualifier("testFourTaskDetail") JobDetail testTwoTaskDetail){CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean();cronTriggerFactoryBean.setJobDetail(testTwoTaskDetail);//初始的Cron表达式//cronTriggerFactoryBean.setCronExpression("0 0/15 * * * ?");cronTriggerFactoryBean.setCronExpression("* * * * * ?");return cronTriggerFactoryBean;}//Quartz 调度工厂@Bean("scheduler")public SchedulerFactoryBean schedulerFactoryBean(@Qualifier("testFourTaskTrigger") Trigger testFourTaskTrigger){SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();schedulerFactoryBean.setOverwriteExistingJobs(true); // 如果存在重复的任务,会覆盖//  延迟启动 1sschedulerFactoryBean.setStartupDelay(1);// 配置线程池Properties quartzProperties = new Properties();quartzProperties.setProperty("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");// 设置线程池大小为10 threadCount 决定了最多可以并行执行多少个任务,多个任务可以同时运行,互不阻塞。quartzProperties.setProperty("org.quartz.threadPool.threadCount", "10");quartzProperties.setProperty("org.quartz.threadPool.threadPriority", "5"); //线程优先级schedulerFactoryBean.setQuartzProperties(quartzProperties);//注册触发器schedulerFactoryBean.setTriggers(testFourTaskTrigger);return schedulerFactoryBean;}

下面是任务:

    @SchedulerTaskLock(name = SchedulerTaskEnum.TEST_FOUR_TASK,lockAtMostForString = 1000 * 6 * 5,lockMostTimeForString = 1000 * 60 * 5,saveLock = true,saveType = SchedulerTask.ALL,lockStatus = true)public void testFourTask() throws InterruptedException {Thread.sleep(11000);int[] numbers = {1, 2, 3};System.out.println(numbers[3]);log.info("============= testFourTask============");SchedulerTaskUtils.updateChannelTag(TagEnum.ERROR_TAG,"testFourTask执行逻辑时出现错误");SchedulerTaskUtils.updateChannelTag(TagEnum.SUCCESS_TAG);}

下面是pom:

        <dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.2</version></dependency><!-- Quartz Scheduler --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId></dependency>

我这个任务是每秒执行一次,我这个任务是测试的下标越界异常捕获否示例,所有报错是很正常的,如下:
在这里插入图片描述
在这里插入图片描述

下面是执行刷新cron表达式的效果:
triggerKey是你的触发器的bean name,cronExpression是你要更新的cron表达式。
在这里插入图片描述
看下图,可以看到刷新成功了。
在这里插入图片描述
然后我们看它的执行频率:
在这里插入图片描述
明显不是每秒执行一次了。

2. 实现代码

下面是代码:
工具类:

package org.example.quartz;import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;import javax.annotation.Resource;/**
* @description: TODO
* @author 杨镇宇
* @date 2024/7/31 14:05
* @version 1.0
*/
@Configuration
@EnableScheduling
@Slf4j
public class SchedulerRefresh {// 静态成员变量,存储Scheduler对象private static Scheduler scheduler;// 使用ApplicationContext注入Scheduler@Autowiredpublic void setScheduler(Scheduler scheduler) {SchedulerRefresh.scheduler = scheduler;  // 将注入的Scheduler赋值给静态成员变量}public static boolean refresh(String triggerKey, String cronExpression) throws SchedulerException {// 获取当前的 TriggerTriggerKey key = TriggerKey.triggerKey(triggerKey);CronTrigger oldTrigger = (CronTrigger) scheduler.getTrigger(key);if (null != oldTrigger) {// 如果存在,创建一个新的 CronTriggerCronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);CronTrigger newTrigger = oldTrigger.getTriggerBuilder().withSchedule(cronScheduleBuilder).build();// 重新调度任务scheduler.rescheduleJob(key, newTrigger);log.info("已刷新Cron表达式,新的表达式为: {}", cronExpression);return Boolean.TRUE;} else {log.warn("未找到指定的 Trigger: {}", triggerKey);return Boolean.FALSE;}}}

controller:

    @ApiOperation(value = "刷新cron表达式", notes = "刷新cron表达式")@CommonLog(methodName = "刷新cron表达式",className = "TSchedulerLockController#schedulerRefresh")@RequestMapping(value = "/schedulerRefresh", method = RequestMethod.POST)public ResponseResult schedulerRefresh(@Validated @RequestBody SchedulerRefreshVo searchParam){boolean refreshRes;try {refreshRes = SchedulerRefresh.refresh(searchParam.getTriggerKey(),searchParam.getCronExpression());}catch (SchedulerException sc){log.error("定时器刷新cron失败",sc);throw  new RunException(ExceptionEnum.ERROR_MSG,"定时器刷新cron失败");}return ResponseResult.ok(refreshRes);}

vo:

package org.example.vo;import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import org.hibernate.validator.constraints.NotEmpty;/**
* @author 杨镇宇
* @date 2025/1/21 9:25
* @version 1.0
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class SchedulerRefreshVo {@ApiModelProperty("triggerKey")@NotEmpty(message ="triggerKey不能为空")private String triggerKey;@ApiModelProperty("cronExpression")@NotEmpty(message ="cronExpression不能为空")private String cronExpression;
}

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

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

相关文章

MySQL中的关联查询:方式、区别及示例

MySQL中的关联查询&#xff1a;方式、区别及示例 在数据库操作中&#xff0c;我们常常需要从多个相关的表中获取数据&#xff0c;这就用到了关联查询。MySQL提供了多种关联查询方式&#xff0c;每种方式都有其特点和适用场景。下面我们就来详细探讨这些关联查询的使用方式、它…

软件卸载不干净?用“它”一键卸载!

前言&#xff1a; 今天我要向大家推荐一款适用于Windows系统的卸载工具&#xff0c;它是一款完全免费且开源的软件&#xff0c;使用体验极佳&#xff0c;绝对值得大家一试。 Bulk Crap Uninstalle 这款名为Bulk Crap Uninstaller的软件&#xff0c;相较于系统自带的卸载工具…

使用AI生成金融时间序列数据:解决股市场的数据稀缺问题并提升信噪比

“GENERATIVE MODELS FOR FINANCIAL TIME SERIES DATA: ENHANCING SIGNAL-TO-NOISE RATIO AND ADDRESSING DATA SCARCITY IN A-SHARE MARKET” 论文地址&#xff1a;https://arxiv.org/pdf/2501.00063 摘要 金融领域面临的数据稀缺与低信噪比问题&#xff0c;限制了深度学习在…

吴恩达深度学习——如何实现神经网络

来自吴恩达深度学习&#xff0c;仅为本人学习所用。 文章目录 神经网络的表示计算神经网络的输出激活函数tanh选择激活函数为什么需要非激活函数双层神经网络的梯度下降法 随机初始化 神经网络的表示 对于简单的Logistic回归&#xff0c;使用如下的计算图。 如果是多个神经元…

MATLAB 如何避免复杂shp文件对inpolygon的影响

**任务描述&#xff1a;**当我想用inpolygon函数将属于非洲的pixel选出来时&#xff0c;发现因为周边小岛的影响&#xff0c;pixel选取有问题&#xff0c;如下图。 第一种解决办法&#xff1a; 首先将复杂shp文件查分成简单的shp文件&#xff0c;即将不相交的元素分离开 [QGIS…

【机器学习】嘿马机器学习(科学计算库)第11篇:Pandas,学习目标【附代码文档】

本教程的知识点为&#xff1a;机器学习&#xff08;常用科学计算库的使用&#xff09;基础定位 机器学习概述 机器学习概述 1.5 机器学习算法分类 1 监督学习 机器学习概述 1.7 Azure机器学习模型搭建实验 Azure平台简介 Matplotlib 3.2 基础绘图功能 — 以折线图为例 1 完善原…

FFPlay命令全集合

FFPlay是以FFmpeg框架为基础&#xff0c;外加渲染音视频的库libSDL构建的媒体文件播放器。 ffplay工具下载并播放视频&#xff0c;可以辅助卡看流信息。 官网下载地址&#xff1a;http://ffmpeg.org/download.html#build-windows 下载build好的exe程序&#xff1a; 此处下载…

DNS未响应服务问题的解决(电脑连着网但浏览器访问不了网页)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

vue视频流播放,支持多种视频格式,如rmvb、mkv

先将视频转码为ts ffmpeg -i C:\test\3.rmvb -codec: copy -start_number 0 -hls_time 10 -hls_list_size 0 -f hls C:\test\a\output.m3u8 后端配置接口 import org.springframework.core.io.Resource; import org.springframework.core.io.UrlResource; import org.spring…

从 0 开始实现一个 SpringBoot + Vue 项目

从 0 开始实现一个 SpringBoot Vue 项目 从 0 开始实现一个 SpringBoot Vue 项目 软件和工具创建 SpringBoot 后端项目创建 MySQL 数据库配置文件实现增删改查接口 Model 层mapper 层service 层controller 层测试 实现项目功能接口 代码测试 创建 Vue 前端 安装 Node.js配置…

每日一题洛谷P1423 小玉在游泳c++

#include<iostream> using namespace std; int main() {double s;cin >> s;int n 0;double sum 0;double k 2;while (sum < s) {sum k;n;k * 0.98;}cout << n << endl;return 0; }

flutter跨端UI框架简介

flutter跨端UI框架简介 简介 Flutter是由Google开发的开源应用开发框架&#xff0c;主要用于构建高性能、跨平台的移动、Web和桌面应用程序。Flutter使用Dart语言&#xff0c;提供了一套丰富的Widgets&#xff0c;使开发者能够快速创建美观的用户界面。其最大特点是热重载功能…

java提取系统应用的日志中的sql获取表之间的关系

为了获取到对应的sql数据&#xff0c;分了三步骤 第一步&#xff0c;获取日志文件&#xff0c;解析日志文件中的查询sql&#xff0c;递归解析sql&#xff0c;获取表关系集合 递归解析sql&#xff0c;获取表与表之间的关系 输出得到的对应关联关系数据 第二步&#xff0c;根据获…

16_动态提示窗口_协程延时

创建动态提示窗口DynamicWnd.cs 编写代码 using UnityEngine; using UnityEngine.UI; //功能 : 动态窗口界面 public class DynamicWnd : WindowsRoot{public Animation tipsAni;public Text txtTips;protected override void InitWnd() {base.InitWnd();//在启动时先隐藏提示…

路由器旁挂三层网络实现SDWAN互联(爱快SD-WAN)

近期因公司新办公区建设&#xff0c;原有的爱快路由器的SDWAN功能实现分支之间互联的服务还需要继续使用。在原有的小型网络中&#xff0c;使用的爱快路由器当作网关设备&#xff0c;所以使用较为简单,如下图所示。 现变更网络拓扑为三层网络架构&#xff0c;但原有的SDWAN分支…

隐私保护+性能优化,RyTuneX 让你的电脑更快更安全

RyTuneX 是一款专为 Windows 10 和 11 用户量身打造的系统优化工具&#xff0c;采用先进的 WinUI 3 框架开发&#xff0c;以其现代化的设计风格和强大的功能集合脱颖而出。这款工具不仅界面简洁美观&#xff0c;还提供了多样化的系统优化选项&#xff0c;旨在帮助用户最大化设备…

java上传图片功能实现

1 MinIO核心概念 下面介绍MinIO中的几个核心概念&#xff0c;这些概念在所有的对象存储服务中也都是通用的。 对象&#xff08;Object&#xff09; 对象是实际的数据单元&#xff0c;例如我们上传的一个图片。 存储桶&#xff08;Bucket&#xff09; 存储桶是用于组织对象的命…

深入MapReduce——引入

引入 前面我们已经深入了HDFS的设计与实现&#xff0c;对于分布式系统也有了不错的理解。 但HDFS仅仅解决了海量数据存储和读写的问题。要想让数据产生价值&#xff0c;一定是需要从数据中挖掘出价值才行&#xff0c;这就需要我们拥有海量数据的计算处理能力。 下面我们还是…

解决npm install安装出现packages are looking for funding run `npm fund` for details问题

当我们运行npm install时&#xff0c;可能会收到类似以下的提示信息&#xff1a;“x packages are looking for funding.” 这并不是错误提示&#xff0c;也不会影响项目的正常运行。其实实在提醒有一些软件包正在寻求资金支持。 根据提示输入npm fund可以查看详细的信息&#…

小米Vela操作系统开源:AIoT时代的全新引擎

小米近日正式开源了其物联网嵌入式软件平台——Vela操作系统&#xff0c;并将其命名为OpenVela。这一举动在AIoT&#xff08;人工智能物联网&#xff09;领域掀起了不小的波澜&#xff0c;也为开发者们提供了一个强大的AI代码生成器和开发平台。OpenVela项目源代码已托管至GitH…