基于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.rhkb.cn/news/6240.html

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

相关文章

LabVIEW智能胎压监测

汽车行车安全是社会关注焦点&#xff0c;轮胎压力异常易引发交通事故&#xff0c;开发胎压监测系统可保障行车安全、降低事故发生率。 系统组成与特点 &#xff08;一&#xff09;硬件组成 BMP - 280 气体压力传感器&#xff1a;高精度、稳定性好、能耗低&#xff0c;适合车载…

C语言教程——文件处理(1)

目录 前言 二、什么是文件 2.1文件的概念 2.2程序文件 2.3数据文件 2.4文件名 2.5二进制文件和文本文件 三、文件操作 3.1文件指针 3.2文件的打开与关闭 四、文件的顺序读写 4.1fgetc 4.2fputc 4.3fputs 4.4fgets 总结 前言 我们知道电脑上有许许多多的文件&a…

【橘子ES】Kibana的分析能力Analytics简易分析

一、kibana是啥&#xff0c;能干嘛 我们经常会用es来实现一些关于检索&#xff0c;关于分析的业务。但是es本身并没有UI,我们只能通过调用api来完成一些能力。而kibana就是他的一个外置UI&#xff0c;你完全可以这么理解。 当我们进入kibana的主页的时候你可以看到这样的布局。…

c#的tabControl控件实现自定义标签颜色

最近项目需要自定义tabControl控件颜色&#xff0c;而默认这个控件是不支持自定义标签颜色的&#xff0c;于是想办法实现了这个功能&#xff0c;效果如下图所示&#xff1a; 直接上代码&#xff1a; using System; using System.Collections.Generic; using System.ComponentM…

从零到一:Spring Boot 与 RocketMQ 的完美集成指南

1.Rocket的概念与原理 RocketMQ 是一款由阿里巴巴开源的分布式消息中间件&#xff0c;最初用于支持阿里巴巴的海量业务。它基于发布-订阅模型&#xff0c;具备高吞吐、低延迟、高可用和强一致性的特点&#xff0c;适用于消息队列、大规模数据流处理等场景。以下是对 RocketMQ …

Odoo免费开源ERP最佳业务实践:生产管理

文 / 开源智造&#xff08;OSCG&#xff09; Odoo亚太金牌服务 概述 Odoo是全球排名第一的免费开源ERP系统&#xff0c;以其强大的功能和模块化设计著称&#xff0c;适用于各种规模及类型的企业。Odoo集成了生产、采购、销售、库存、财务、人力资源、市场营销、电子商务等多个…

1.CSS的三大特性

css有三个非常重要的三个特性&#xff1a;层叠性、继承性、优先级 1.1 层叠性 想通选择器给设置想听的样式&#xff0c;此时一个样式就会覆盖&#xff08;层叠&#xff09;另一个冲突的样式。层叠性主要是解决样式冲突的问题。 <!DOCTYPE html> <html lang"en&…

【2024年华为OD机试】(A卷,200分)- 优雅子数组 (JavaScriptJava PythonC/C++)

一、问题描述 题目描述 如果一个数组中出现次数最多的元素出现大于等于 k 次&#xff0c;被称为 k-优雅数组&#xff0c;k 也可以被称为优雅阈值。 例如&#xff1a; 数组 [1, 2, 3, 1, 2, 3, 1] 是一个 3-优雅数组&#xff0c;因为元素 1 出现次数大于等于 3 次。数组 [1,…

电子应用设计方案102:智能家庭AI鱼缸系统设计

智能家庭 AI 鱼缸系统设计 一、引言 智能家庭 AI 鱼缸系统旨在为鱼类提供一个健康、舒适的生活环境&#xff0c;同时为用户提供便捷的管理和观赏体验。 二、系统概述 1. 系统目标 - 自动维持水质稳定&#xff0c;包括水温、酸碱度、硬度和溶氧量等关键指标。 - 智能投食&…

智能化加速标准和协议的更新并推动验证IP(VIP)在芯片设计中的更广泛应用

作者&#xff1a;Karthik Gopal, SmartDV Technologies亚洲区总经理 智权半导体科技&#xff08;厦门&#xff09;有限公司总经理 随着AI技术向边缘和端侧设备广泛渗透&#xff0c;芯片设计师不仅需要考虑在其设计中引入加速器&#xff0c;也在考虑采用速度更快和带宽更高的总…

Vue3.5 企业级管理系统实战(三):页面布局及样式处理 (Scss UnoCSS )

本章主要是关于整体页面布局及样式处理&#xff0c;在进行这一章代码前&#xff0c;先将前两章中的示例代码部分删除&#xff08;如Home.vue、About.vue、counter.ts、App.vue中引用等&#xff09; 1 整体页面布局 页面整体布局构成了产品的框架基础&#xff0c;通常涵盖主导…

Linux 消息队列的使用方法

文章目录 1.概念2. 创建消息队列3. 发送消息4. 接收消息5. 消息结构体6. 消息队列控制&#xff08;删除、获取队列状态&#xff09;消息队列是否存在7. 使用场景8. 注意事项使用例子判断消息队列是否存在的代码获取队列空间大小 1.概念 消息队列是一种进程间通信 (IPC) 机制&a…

低代码可视化-转盘小游戏可视化-代码生成器

转盘小程序是一种互动工具&#xff0c;它通过模拟真实的转盘抽奖或决策体验&#xff0c;为用户提供了一种有趣且公平的选择方式。以下是对转盘小程序的详细介绍&#xff1a; 转盘小程序的应用场景 日常决策&#xff1a;转盘小程序可以帮助用户解决日常生活中的选择困难问题&a…

【Prometheus】Prometheus如何监控Haproxy

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

仅仅4M!windows系统适用,免费无限制使用!

软件介绍 在日常生活里&#xff0c;我们经常会碰到电脑运行迟缓、网速卡顿的现象&#xff0c;却又不清楚是哪个程序在占用过多资源。这种时候&#xff0c;一款能实时监测网络和系统状态的工具就变得非常关键了。今天呢&#xff0c;就给大家介绍一个小巧又实用的监控工具——「T…

计算机毕业设计hadoop+spark+hive图书推荐系统 豆瓣图书数据分析可视化大屏 豆瓣图书爬虫 知识图谱 图书大数据 大数据毕业设计 机器学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

Harmony Next 支持创建分身

应用分身能实现在一个设备上安装多个相同的应用&#xff0c;实现多个账号同时登录使用和运行并且互不影响。主要应用场景有社交账号双开、游戏大小号双开等&#xff0c;无需账号切换&#xff0c;从而省去频繁登录的繁琐。 Harmony Next 很容易就能让 App 支持创建分身。 官方文…

Linux下 date时间应该与系统的 RTC(硬件时钟)同步

发现客户服务器时间与真实时间不同&#xff0c;并且服务器没有网络。 解决办法&#xff1a;时间应该与系统的 RTC&#xff08;硬件时钟&#xff09;同步 手动设置系统时间 使用 date 命令将系统时间设置为 2025年01月21日 14:12:00&#xff1a; sudo date --set"2025-01…

XX污水处理厂基于RK3576核心板应用(四)——人员倒地智能识别系统方案

通过 SAIL-RK3576核心板 支撑的 人员倒地识别系统&#xff0c;污水处理厂能够在广阔、复杂的区域内实时监控人员安全&#xff0c;实现意外倒地等事故的秒级响应与干预。搭配多元人形动态监测机制&#xff0c;还可进一步拓展对其他异常动作或不安全行为的识别&#xff0c;持续保…

【IEEE Fellow 主讲报告| EI检索稳定】第五届机器学习与智能系统工程国际学术会议(MLISE 2025)

重要信息 会议时间地点&#xff1a;2025年6月13-15日 中国深圳 会议官网&#xff1a;http://mlise.org EI Compendex/Scopus稳定检索 会议简介 第五届机器学习与智能系统工程国际学术会议将于6月13-15日在中国深圳隆重召开。本次会议旨在搭建一个顶尖的学术交流平台&#xf…