基于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); // 如果存在重复的任务,会覆盖
        //  延迟启动 1s
        schedulerFactoryBean.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
    @Autowired
    public void setScheduler(Scheduler scheduler) {
        SchedulerRefresh.scheduler = scheduler;  // 将注入的Scheduler赋值给静态成员变量
    }

    public static boolean refresh(String triggerKey, String cronExpression) throws SchedulerException {
        // 获取当前的 Trigger
        TriggerKey key = TriggerKey.triggerKey(triggerKey);
        CronTrigger oldTrigger = (CronTrigger) scheduler.getTrigger(key);

        if (null != oldTrigger) {
            // 如果存在,创建一个新的 CronTrigger
            CronScheduleBuilder 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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

63,【3】buuctf web Upload-Labs-Linux 1

进入靶场 点击pass1 查看提示 既然是上传文件&#xff0c;先构造一句话木马&#xff0c;便于用蚁剑连接 <?php eval($_POST[123])?> 上传木马 文件后缀写为.php.jpg 右键复制图片地址 打开蚁剑连接 先点击测试连接&#xff0c;显示成功后&#xff0c;再点击添加即可 …

Linux操作命令之云计算基础命令

一、图形化界面/文本模式 ctrlaltF2-6 图形切换到文本 ctrlalt 鼠标跳出虚拟机 ctrlaltF1 文本切换到图形 shift ctrl "" 扩大 ctrl "-" 缩小 shift ctrl "n" 新终端 shift ctrl "t" 新标签 alt 1,…

计算机毕业设计hadoop+spark视频推荐系统 短视频推荐系统 视频流量预测系统 短视频爬虫 视频数据分析 视频可视化 视频大数据 大数据

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

【智能解析多线程:线程安全与死锁的深度剖析】

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” 文章目录 温故而知新线程安全问题多线程中有的线程未加锁一个线程有多把锁加了多层锁的代码&#xff0c;执行…

Grafana系列之面板接入Prometheus Alertmanager

关于Grafana的仪表板Dashboard&#xff0c;以及面板Panel&#xff0c;参考Grafana系列之Dashboard。可以直接在面板上创建Alert&#xff0c;即所谓的Grafana Alert&#xff0c;参考Grafana系列之Grafana Alert。除了Grafana Alert外&#xff0c;面板也可接入Prometheus Alertma…

【深度学习入门】深度学习知识点总结

一、卷积 &#xff08;1&#xff09;什么是卷积 定义&#xff1a;特征图的局部与卷积核做内积的操作。 作用&#xff1a;① 广泛应用于图像处理领域。卷积操作可以提取图片中的特征&#xff0c;低层的卷积层提取局部特征&#xff0c;如&#xff1a;边缘、线条、角。 ② 高层…

数据结构 链表2

目录 前言&#xff1a; 一&#xff0c;反转一个链表(迭代) 二&#xff0c;打印一个链表&#xff08;递归&#xff09; 三&#xff0c;反转一个链表(递归) 四&#xff0c;双向链表 总结 前言&#xff1a; 我们根据 [文章 链表1] 可以知道链表相比较于数组的优缺点和计算机…

curl简介与libcurl开源库的使用总结

curl工具和libcurl不是同一个东西&#xff0c;二者的关系主要体现在以下方面&#xff1a; 定义与性质 curl工具&#xff1a; 是一个利用URL语法在命令行下工作的文件传输工具&#xff0c;1997年首次发行。它支持多种协议&#xff0c;如HTTP、HTTPS、FTP、FTPS等&#xff0c;可用…

node.js 07.npm下包慢的问题与nrm的使用

一.npm下包慢 因为npm i 默认从npm官网服务器进行下包,但是npm官网服务器是海外服务器所以响应很慢. 于是我们通过npm下包的时候通常用淘宝镜像进行下包,下面是切换到淘宝镜像地址下包的操作. 二.nrm的使用 nrm是一个管理切换npm下包地址的工具,可以快速切换下包的地址. 安…

Flutter:carousel_slider 横向轮播图、垂直轮播公告栏实现

安装依赖 carousel_slider: ^5.0.01、垂直滚动公告栏 import package:carousel_slider/carousel_options.dart;// 垂直滚动公告栏Widget _buildNotice() {return <Widget>[<Widget>[TDImage(assetUrl: "assets/img/home11.png",width: 60.w,height: 60.w…

RavenMarket:用AI和区块链重塑预测市场

不论是美股市场还是加密市场&#xff0c;AI都是本轮周期里的最大叙事。本轮AI的最大受益者英伟达市值超越苹果一跃成为全球第一大公司&#xff0c;加密领域围绕着AI的创新也是层出不穷&#xff0c;很多项目方开始向着AI转型。 而近期币圈最热门的板块就是AI agent&#xff0c;…

【玩转全栈】----Django基本配置和介绍

目录 Django基本介绍&#xff1a; Django基本配置&#xff1a; 安装Django 创建项目 创建app 注册app Django配置路由URL Django创建视图 启动项目 Django基本介绍&#xff1a; Django是一个开源的、基于Python的高级Web框架&#xff0c;旨在以快速、简洁的方式构建高质量的Web…

学技术学英语:TCP的三次握手和四次挥手

单词 汉语意思 音标 acknowledge 承认&#xff0c;确认 /əkˈnɒl.ɪdʒ/ acknowledgment 确认&#xff0c;承认 /əkˈnɒl.ɪdʒ.mənt/ duplex 双向的 /ˈdjuː.pleks/ establish 建立 /ɪˈstb.lɪʃ/ handshake 握手&#xff0c;握手协议 /ˈhnd.ʃeɪk…

iconfont等图标托管网站上传svg显示未轮廓化解决办法

打开即时设计 即时设计 - 可实时协作的专业 UI 设计工具 导入图标后拖入画板里面&#xff0c;右键选择轮廓化 将图标导出

SpringBoot集成Flink-CDC,实现对数据库数据的监听

一、什么是 CDC &#xff1f; CDC 是Change Data Capture&#xff08;变更数据获取&#xff09;的简称。 核心思想是&#xff0c;监测并捕获数据库的变动&#xff08;包括数据或数据表的插入、 更新以及删除等&#xff09;&#xff0c;将这些变更按发生的顺序完整记录下来&…

豆包 MarsCode + 开源 = ?AI 助力开源社区新人成长

来源&#xff5c;豆包 MarsCode “开源” 这个词&#xff0c;对开发者来说&#xff0c;可能是入门时的第一步&#xff0c;也可能是追求极致技术的终点。无数优秀的开源项目不仅推动了技术的进步&#xff0c;也成为开发者学习和成长的宝藏&#xff0c;但同时也因为其规模庞大、代…

STM32-CAN总线

1.CAN总线简介 CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线 2.CAN总线特征 两根通信线&#xff08;CAN_H、CAN_L&#xff09;&#xff0c;线路少&#xff0c;无需共地差分信号通信&#xff08;相对的是单端信号&#xff09;&#…

机器学习-线性回归(简单回归、多元回归)

这一篇文章&#xff0c;我们主要来理解一下&#xff0c;什么是线性回归中的简单回归和多元回归&#xff0c;顺便掌握一下特征向量的概念。 一、简单回归 简单回归是线性回归的一种最基本形式&#xff0c;它用于研究**一个自变量&#xff08;输入&#xff09;与一个因变量&…

Linux 高级路由与流量控制-用 tc qdisc 管理 Linux 网络带宽

大家读完记得觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 此分享内容比较专业&#xff0c;很多与硬件和通讯规则及队列&#xff0c;比较底层需要有技术功底人员深入解读。 Linux 的带宽管理能力 足以媲美许多高端、专用的带宽管理系统。 1 队列&#xff0…

安装k8s前置操作(Ubuntu / CentOS)

本文将介绍在 Ubuntu 和 CentOS 系统上进行 Kubernetes 部署前的基本配置步骤。不同的操作系统有不同的配置方法&#xff0c;但大部分操作是相似的。本文章将分为两个部分&#xff1a;第一部分是 Ubuntu 前置操作&#xff0c;第二部分是 CentOS 前置操作。 第一节&#xff1a;U…