SpringBoot定时任务+Quartz 动态调度

1、分部解释
2、完整代码
3、SpringBoot定时任务+Quartz

1、动态定时任务:

  • 动态定时任务,即定时任务的动态调度,可根据需求自由的进行任务的生成、暂停、恢复、删除和更新操作。
  • Quartz本身没有提供动态调度的功能,需要自己根据相关的API开发。

2、动态定时任务使用场景:

  • 订单成功后自动发短信通知
  • 每日推送的功能引发用户不满,不再定时推送
  • 每日下班前30分钟发送工作报表,遇节假日暂停发送

3、Scheduler调度器常用API

在这里插入图片描述

4、实现动态调度的定时任务

在这里插入图片描述
注释:
JobBean:封装,任务调度的参数,不在使用默认的调度方式。

代码演示:
1、JobBean 类:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class JobBean {//任务名字private String jobName;//任务类,(自己任务,实现类的全类名) --->任务类.class.getName()private String jobClass;//cron表达式private String cronExpression;
}

2、创建一个工具类:

2.1、创建定时任务:

    //创建任务public static void createJob(Scheduler scheduler, JobBean jobBean) {//通过类的名字获取类Class<? extends Job> jobClass = null;CronTrigger trigger =null;JobDetail jobDetail =null;try {jobClass = (Class<? extends Job>) Class.forName(jobBean.getJobClass());jobDetail = JobBuilder.newJob(jobClass).storeDurably()//唯一标识.withIdentity(jobBean.getJobName()).build();//创建触发器trigger = TriggerBuilder.newTrigger().forJob(jobDetail)//唯一标识和上面的JobDetail是配对的。当然写别的名称也是可以的,就是一个标识.withIdentity(jobBean.getJobName())//这个表达式可以写到yml 中进行引用,这样以后更改直接改配置文件即可。//每两秒钟执行一次.withSchedule(CronScheduleBuilder.cronSchedule(jobBean.getCronExpression())).build();//需要 JobDetail var1, Trigger var2 这两个参数scheduler.scheduleJob(jobDetail, trigger);} catch (ClassNotFoundException e) {throw new RuntimeException(e);}catch (SchedulerException e) {throw new RuntimeException(e);}}

2.2、暂停任务:

 //暂停任务public static void pauseJob(Scheduler scheduler, String jobName) {try {scheduler.pauseJob(JobKey.jobKey(jobName));} catch (SchedulerException e) {throw new RuntimeException(e);}}

2.3、恢复任务:

    //恢复任务public static void resumeJob(Scheduler scheduler, String jobName) {try {scheduler.resumeJob(JobKey.jobKey(jobName));} catch (SchedulerException e) {throw new RuntimeException(e);}}

2.4、删除任务:

    //删除任务public static void deleteJob(Scheduler scheduler, String jobName) {try {scheduler.deleteJob(JobKey.jobKey(jobName));} catch (SchedulerException e) {throw new RuntimeException(e);}}

2.5、执行一次任务

 //执行一次任务public static void runOnce(Scheduler scheduler, String jobName) {try {scheduler.triggerJob(JobKey.jobKey(jobName));} catch (SchedulerException e) {throw new RuntimeException(e);}}

2.6、修改任务

 //修改任务public static void updateJob(Scheduler scheduler, JobBean jobBean) {try {TriggerKey triggerKey = TriggerKey.triggerKey(jobBean.getJobName());//强制转换成CronTriggerCronTrigger oldTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
//             oldTrigger.getTriggerBuilder();  将老的trigger返回出来CronTrigger newTrigger = oldTrigger.getTriggerBuilder().withSchedule(CronScheduleBuilder.cronSchedule(jobBean.getCronExpression())).build();scheduler.rescheduleJob(triggerKey,newTrigger);} catch (SchedulerException e) {throw new RuntimeException(e);}}

5、编写控制器方法:

在这里插入图片描述

完整代码:

1、pom文件

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId></dependency>

2、任务调度需要参数类(封装参数类 POJO)

@Data
@AllArgsConstructor
@NoArgsConstructor
public class JobBean {//任务名字private String jobName;//任务类,(自己任务,实现类的全类名) --->任务类.class.getName()private String jobClass;//cron表达式private String cronExpression;
}

3、工具类:

public class DynJobUtil {//创建任务public static void createJob(Scheduler scheduler, JobBean jobBean) {//通过类的名字获取类Class<? extends Job> jobClass = null;CronTrigger trigger =null;JobDetail jobDetail =null;try {jobClass = (Class<? extends Job>) Class.forName(jobBean.getJobClass());jobDetail = JobBuilder.newJob(jobClass).storeDurably()//唯一标识.withIdentity(jobBean.getJobName()).build();//创建触发器trigger = TriggerBuilder.newTrigger().forJob(jobDetail)//唯一标识和上面的JobDetail是配对的。当然写别的名称也是可以的,就是一个标识.withIdentity(jobBean.getJobName())//这个表达式可以写到yml 中进行引用,这样以后更改直接改配置文件即可。//每两秒钟执行一次.withSchedule(CronScheduleBuilder.cronSchedule(jobBean.getCronExpression())).build();//需要 JobDetail var1, Trigger var2 这两个参数scheduler.scheduleJob(jobDetail, trigger);} catch (ClassNotFoundException e) {throw new RuntimeException(e);}catch (SchedulerException e) {throw new RuntimeException(e);}}//暂停任务public static void pauseJob(Scheduler scheduler, String jobName) {try {scheduler.pauseJob(JobKey.jobKey(jobName));} catch (SchedulerException e) {throw new RuntimeException(e);}}//恢复任务public static void resumeJob(Scheduler scheduler, String jobName) {try {scheduler.resumeJob(JobKey.jobKey(jobName));} catch (SchedulerException e) {throw new RuntimeException(e);}}//删除任务public static void deleteJob(Scheduler scheduler, String jobName) {try {scheduler.deleteJob(JobKey.jobKey(jobName));} catch (SchedulerException e) {throw new RuntimeException(e);}}//执行一次任务public static void runOnce(Scheduler scheduler, String jobName) {try {scheduler.triggerJob(JobKey.jobKey(jobName));} catch (SchedulerException e) {throw new RuntimeException(e);}}//修改任务public static void updateJob(Scheduler scheduler, JobBean jobBean) {try {TriggerKey triggerKey = TriggerKey.triggerKey(jobBean.getJobName());//强制转换成CronTriggerCronTrigger oldTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
//             oldTrigger.getTriggerBuilder();  将老的trigger返回出来CronTrigger newTrigger = oldTrigger.getTriggerBuilder().withSchedule(CronScheduleBuilder.cronSchedule(jobBean.getCronExpression())).build();scheduler.rescheduleJob(triggerKey,newTrigger);} catch (SchedulerException e) {throw new RuntimeException(e);}}
}

4、自己的任务

@Slf4j
@DisallowConcurrentExecution
@PersistJobDataAfterExecution
public class MyJob extends QuartzJobBean {@Overrideprotected void executeInternal(JobExecutionContext context) throws JobExecutionException {System.out.println("任务开始执行");JobDetail jobDetail = context.getJobDetail();System.out.println("名字" + jobDetail.getKey().getName());System.out.println("类名--->" + jobDetail.getJobClass().getName());System.out.println("本次执行的时间为---》" + context.getFireTime());System.out.println("下次执行的时间为---》" + context.getNextFireTime());System.out.println("任务执行完毕");System.out.println("============================");}
}

5、进行测试:

@Slf4j
@Controller
@RequestMapping("/job")
public class DynJob {@Autowiredprivate Scheduler scheduler;JobBean jobBean = new JobBean("jobDetail",MyJob.class.getName(),"0/5 * * * * ?");//创建任务@GetMapping("/createJob")public void createJob(){log.info("jobBean:{}",jobBean);log.info("创建任务");DynJobUtil.createJob(scheduler,jobBean);}//暂停任务@GetMapping("/pauseJob")public void pauseJob(){JobBean jobBean = new JobBean("jobDetail","jobClass","0/5 * * * * ?");log.info("jobBean:{}",jobBean);log.info("暂停任务");DynJobUtil.pauseJob(scheduler,jobBean.getJobName());}//恢复任务@GetMapping("/resumeJob")public void resumeJob(){log.info("jobBean:{}", jobBean);log.info("恢复任务");DynJobUtil.resumeJob(scheduler, jobBean.getJobName());}//删除任务@GetMapping("/deleteJob")public void deleteJob(){log.info("jobBean:{}", jobBean);log.info("删除任务");DynJobUtil.deleteJob(scheduler, jobBean.getJobName());}//执行一次任务,暂停之后就是执行一次,之后不在执行@GetMapping("/runJob")public void runJob(){log.info("jobBean:{}", jobBean);log.info("执行一次任务");DynJobUtil.runOnce(scheduler, jobBean.getJobName());}//修改任务@GetMapping("/modifyJob")public void modifyJob() {jobBean.setCronExpression("0/2 * * * * ?");log.info("jobBean:{}", jobBean);log.info("修改任务");DynJobUtil.updateJob(scheduler, jobBean);}
}

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

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

相关文章

wireshark源码分析 是怎么完成协议识别的

代码流程 通过process_packet_single_pass处理单个数据包&#xff0c;每层数据包都会使用decode_udp(tcp)_ports识别协议&#xff0c;这里面提供端口和特征识别&#xff1b; 端口识别&#xff1a;dissector_try_uint_new 在接口内通过find_uint_dtbl_entry 如果是一个HTTP数…

数据可视化之常用图表热力图

1.什么是热力图&#xff1f; 热力图&#xff0c;是一种通过对色块着色来显示数据的统计图表。 绘图时&#xff0c;需指定颜色映射的规则。 例如&#xff0c;较大的值由较深的颜色表示&#xff0c;较小的值由较浅的颜色表示&#xff1b;较大的值由偏暖的颜色表示&#xff0c;…

【摄影测量02】什么是内外方位参数?坐标系旋转变换?

【摄影测量02】什么是内外方位参数&#xff1f;坐标系旋转变换&#xff1f; 文章目录 【摄影测量02】什么是内外方位参数&#xff1f;坐标系旋转变换&#xff1f;引言1 内方位元素与外方位元素1.1 内方位元素1.2 外方位元素 2 旋转矩阵的概念与应用2.1 旋转矩阵的定义2.2 坐标变…

chatglm3-6b小试

原本想在VMware中装个unbutu&#xff0c;再搞chatglm&#xff0c;但经过调研发现业内都是采用双系统来搞chat的开发。于是只好用rufus制作了一个ubuntu22.04的系统盘&#xff0c;你需要准备8G&#xff0c;因为制作好镜像后是7个多G。安装这里就不说了。 1 ubuntu环境 安装好ubu…

升级HarmonyOS 4.2,开启健康生活篇章

夏日来临&#xff0c;华为智能手表携 HarmonyOS 4.2 版本邀您体验&#xff0c;它不仅可以作为时尚单品搭配夏日绚丽服饰&#xff0c;还能充当你的健康管家&#xff0c;从而更了解自己的身体&#xff0c;开启智能健康生活篇章。 高血糖风险评估优化&#xff0c;健康监测更精准 …

海南聚广众达电子商务咨询有限公司靠谱吗?

在数字经济的浪潮中&#xff0c;抖音电商作为新兴业态&#xff0c;正以其独特的魅力和强大的势能&#xff0c;改变着传统商业模式&#xff0c;引领着新一轮的消费潮流。海南聚广众达电子商务咨询有限公司&#xff0c;作为抖音电商服务领域的佼佼者&#xff0c;凭借其专业的团队…

重学java 65.IO流 缓冲流

I am not afraid tomorrow for I have seen yesterday and love today —— 24.6.5 一、字节缓冲流 1.字节缓冲流的意义 之前所写的FileOutputstream、FileInputstream、FileReader、Filewriter这都叫做基本流,其中FileInputstream和FieOutputstream的读写方法都是本地方法(方…

局域网怎么设置路由器?

在搭建局域网的过程中&#xff0c;设置路由器是非常重要的一步。正确地设置路由器可以确保局域网的正常运行&#xff0c;并且可以更好地保护网络安全。以下是一些关于如何设置路由器的指南。 第一步&#xff1a;获取路由器 您需要获得一台适合您需求的路由器设备。选择一款性能…

idea如何根据路径快速在项目中快速打卡该页面

在idea项目中使用快捷键shift根据路径快速找到该文件并打卡 双击shift(连续按两下shift) -粘贴文件路径-鼠标左键点击选中跳转的路径 自动进入该路径页面 例如&#xff1a;我的实例路径为src/views/user/govType.vue 输入src/views/user/govType或加vue后缀src/views/user/go…

回炉重造java----JUC(第二天)

Monitor---监视器/管程 对象头&#xff1a; 操作系统提供的Monitor对象 Synchronized底层实现原理&#xff1a; ①锁对象在加了synchronized之后&#xff0c;对象头中的Mark Word中就存了一个Monitor的地址指针。 ②当一个线程获取到锁之后&#xff0c;Monitor中的Owner属性指…

Leetcode3168. 候诊室中的最少椅子数

Every day a Leetcode 题目来源&#xff1a;3168. 候诊室中的最少椅子数 解法1&#xff1a;模拟 代码&#xff1a; /** lc appleetcode.cn id3168 langcpp** [3168] 候诊室中的最少椅子数*/// lc codestart class Solution { public:int minimumChairs(string s){int chair…

Web3设计风格和APP设计风格

Web3设计风格和传统APP设计风格在视觉和交互设计上有一些显著的区别。这些差异主要源于Web3技术和理念的独特性&#xff0c;以及它们在用户体验和界面设计中的具体应用。以下是Web3设计风格与传统APP设计风格的主要区别。北京木奇移动技术有限公司&#xff0c;专业的软件外包开…

【PL理论】(5) F#:递归类型 | Immutability 特性(F#中值一旦定义就不会改变)

&#x1f4ad; 写在前面&#xff1a;本文旨在探讨不可变数据结构在 F# 编程中的应用&#xff0c;特别是如何利用递归记录类型来表示和操作数值表达式。通过定义存储整数的二叉树和数值表达式的类型&#xff0c;我们将展示不可变性如何简化程序的理解和维护。文章将对比 F# 与命…

Android音频API介绍

Android系统提供了四个层面的音频API&#xff1a; Java层MediaRecorder&MediaPlayer系列&#xff1b;Java层AudioTrack&AudioRecorder系列&#xff1b;Jni层opensles&#xff1b;JNI层AAudio&#xff08;Android O引入&#xff09; 下面分别介绍这些API的使用及特点。…

Vulnhub-DC-2

靶机IP:192.168.20.135 网络有问题的可以看下搭建Vulnhub靶机网络问题(获取不到IP) kaliIP:192.168.20.128 扫描靶机端口及服务版本 发现开放了80和7744端口 并且是wordpress建站 dirsearch扫描目录 访问前端界面&#xff0c;发现存在重定向 在hosts文件中增加192.168.2…

QT4-QT5升级(3)GBK-UTF-8-乱码“常量中有换行符”

乱码有两种&#xff1a;我命名为汉字乱码菱形乱码如下&#xff1a; 1.文件编码为&#xff1a; GB2312 打开编码&#xff1a; GB2312 编译后&#xff1a; QString 部分字符串 常量中有换行符 char * …

RocketMq源码解析五:生产者Producer发送消息

上一章我们把生产者启动的流程和大家一起跟着源码走了一遍,现在我们来看发送消息的流程。上一章我们已经把核心接口和类关系梳理了一遍。如下图 我们今天重点看MQProducer中的send方法最终的实现。DefaultMQProducer中,send的实现最终还是调用了 defaultMQProducerIm…

微信小程序-案例:本地生活-首页(不使用网络数据请求)

一、 1.页面效果&#xff1a; 二、 1.新建项目并添加页面 在app.json文件中&#xff1a; "pages": ["pages/home/home","pages/message/message","pages/contact/contact"] 2.配置导航栏效果 在app.json文件中&#xff1a; &quo…

yolov8-obb 旋转目标检测 瑞芯微RKNN芯片部署、地平线Horizon芯片部署、TensorRT部署

特别说明&#xff1a;参考官方开源的yolov8代码、瑞芯微官方文档、地平线的官方文档&#xff0c;如有侵权告知删&#xff0c;谢谢。 模型和完整仿真测试代码&#xff0c;放在github上参考链接 模型和代码。 折腾旋转目标检测的小伙伴们看过来&#xff0c;yolov8旋转目标检测部署…

趣测小程序开发搭建,趣测趣玩小程序是何物?

一、趣测小程序简介 趣测趣玩小程序是一款提供趣味测试和玩乐功能的应用程序。用户可以通过该小程序参与各种有趣的测试&#xff0c;这些测试可能涵盖性格、情感、智力等多个方面&#xff0c;旨在为用户提供轻松愉快的体验。同时&#xff0c;该小程序还可能包含一些游戏元素&a…