基于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,一经查实,立即删除!

相关文章

基于 WPF 平台实现成语游戏

一、引言 在软件开发领域&#xff0c;利用各种框架开发有趣的应用程序是提升技术能力和增加开发乐趣的有效方式。WPF&#xff08;Windows Presentation Foundation&#xff09;作为微软强大的桌面应用开发框架&#xff0c;提供了丰富的图形和交互功能。本文将带领大家基于 WPF…

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;使用如下的计算图。 如果是多个神经元…

深入理解 Java 的并发容器

目录 一、为何需要并发容器 二、Java 中的主要并发容器 1. ConcurrentHashMap 2. CopyOnWriteArrayList 3. ConcurrentLinkedQueue 4. BlockingQueue及其实现类 三、并发容器的应用场景 1. 缓存系统 2. 任务队列 3. 数据共享与传递 四、使用并发容器的注意事项 1. …

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

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

埃氏算法C++实现: 快速输出质数( 素数 )

目录 1.简介 算法原理 算法特点 应用场景 2.一般求素数方法 3.埃氏算法求素数 3.1.无动态分配 3.2.有动态分配 1.简介 ‌埃氏算法&#xff08;Eratosthenes Sieve&#xff09;‌&#xff0c;全称为埃拉托斯特尼筛法&#xff0c;是一种由古希腊数学家埃拉托斯特尼在公元…

【机器学习】嘿马机器学习(科学计算库)第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;共同学习进步。…

装饰器模式 - 装饰器模式的实现

引言 装饰器模式&#xff08;Decorator Pattern&#xff09;是设计模式中结构型模式的一种&#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;根据获…

怎么创建一个能在线测试php的html5网页?

代码示例&#xff1a; 一、搭建服务器环境 首先&#xff0c;你需要在服务器上搭建 PHP 运行环境。如果你使用的是 Linux 服务器&#xff0c;可以使用 Apache 或 Nginx 作为 Web 服务器&#xff0c;并安装 PHP 解释器。对于 Windows 服务器&#xff0c;可以使用 WAMP&#xff08…

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分支…