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.rhkb.cn/news/341863.html

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

相关文章

PostgreSQL专家(pcp51)--王丁丁

#PostgreSQL培训 #postgresql认证 #postgreSQL考试 #PG考试 #PG培训

【Linux】Linux工具——gdb

1. gdb 概述 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许&#xff0c;各位比较喜欢那种图形界面方式的&#xff0c;像VC、BCB等IDE的调试&#xff0c;但如果你是在 UNIX平台下做软件&#xff0c;你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能…

记忆化搜索汇总

记忆化搜索简介 记忆化搜索&#xff08;Memoization Search&#xff09;&#xff1a;是一种通过存储已经遍历过的状态信息&#xff0c;从而避免对同一状态重复遍历的搜索算法。 记忆化搜索是动态规划的一种实现方式。在记忆化搜索中&#xff0c;当算法需要计算某个子问题的结果…

面试题------>MySQL!!!

一、连接查询 ①&#xff1a;左连接left join &#xff08;小表在左&#xff0c;大表在右&#xff09; ②&#xff1a;右连接right join&#xff08;小表在右&#xff0c;大表在左&#xff09; 二、聚合函数 SQL 中提供的聚合函数可以用来统计、求和、求最值等等 COUNT&…

Docker配置 之 本地仓库web访问

介绍 Docker是一种开源的应用容器引擎。 Docker可以让开发者打包应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何安装了Docker引擎的服务器上&#xff08;包括Linux机器、Windows机器&#xff09;&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#…

【javaEE初阶】

&#x1f308;&#x1f308;&#x1f308;关于java ⚡⚡⚡java的由来 我们这篇文章主要是来介绍javaEE&#xff0c;一般称为java企业版&#xff0c;实际上java的历史可以追溯到上个世纪90年代&#xff0c;当时主要的语言主流的还是C语言和C&#xff0c;但是在那个时期嵌入式初…

js 一维数组转多维数组

效果图&#xff1a; //源数组const arrList [{"id": 1,"code": "001","name": "第一个","parentCode": "",},{"id": 2,"code": "00101","name": "第一…

使用gradio库实现Web应用,允许用户上传图像,并使用YOLOv8模型对图像进行目标检测。

一、Gradio Gradio 详细介绍 Gradio 是一个用于构建和分享机器学习模型和数据科学应用的开源Python库。它简化了创建交互式Web界面的过程&#xff0c;让开发者可以快速搭建原型并与他人分享。 主要特性 易用性&#xff1a; 无需前端开发经验&#xff1a;只需几行Python代码就…

【简单理解化】 内存函数及它的模拟实现

本文章谈论memcpy,memcmp,memmove,memset函数 目录 1.memcpy的使用和模拟实现 2.memmove的使用和模拟实现 3.memset的使用 4.memcmp函数的使用 1.memcpy的使用和模拟实现 该函数用于从源内存块复制指定数量的字节到目标内存块 1 void * memcpy ( void * destination, const voi…

DVWA-CSRF

CSRF Low 观察后端代码&#xff0c;只要password_new等于password_conf就可以修改密码。由于这两个参数是通过GET传递的&#xff0c;所以直接构造payload。 http://192.168.20.156/DVWA/vulnerabilities/csrf/?password_newpass&password_confpass&ChangeChange# 这…

Windows开启远程桌面

搜索并进入【远程桌面设置】 ​​ 开启远程桌面 ​​​ ipconfig​命令查看ip地址&#xff0c;并使用地址在另一台电脑远程登录此电脑 选择其他账户登录&#xff0c;输入用户和密码 ​​ ​​ 成功登录 ​​

判断经纬度是否在某个城市内

一、从高德获取指定城市边界经纬度信息 通过apifox操作&#xff1a; 二、引入第三方jar包&#xff1a; maven地址&#xff1a;https://mvnrepository.com/ maven依赖&#xff1a; <dependency><groupId>org.locationtech.jts</groupId><artifactId>…

Spring Boot整合Jasypt 库实现配置文件和数据库字段敏感数据的加解密

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

【全开源】Shopro社区团购(小程序版)

邻里间的购物新选择 基于Fastadmin后端管理系统Uniapp客户端&#xff08;仅支持微信小程序&#xff09;开发&#xff0c;生鲜果蔬社区团购的不二之选、快速搭建社区团购平台、让你的产品走进上千个社区。线上团购线下自提&#xff0c;玩转社区消费新模式提供专业、优质的社区团…

如何解决chatgpt出现503 bad gateway的问题

昨日&#xff0c;ChatGPT官网挂了&#xff0c;也就是使用web网页端访问的用户&#xff0c;会出现 bad gateway 情况。我们去ChatGPT官方的监控查看&#xff0c;已经展示相关错误。 影响的范围有&#xff1a; 影响了 ChatGPT 所有计划的所有用户。影响包括所有与 ChatGPT 相关…

实验四、零比特插入《计算机网络》

但凡这句话有一点用的话也不至于一点用都没有。 目录 一、实验目的 二、实验内容 三、实验小结 一、实验目的 掌握零比特插入原理及方法使用任意编程语言实现零比特插入方法。 二、实验内容 掌握零比特插入原理及方法 点对点协议 PPP&#xff08;Point-to-Point Protoco…

计算机三级等级考试

计算机等级考试&#xff1a; 一&#xff1a;理论知识考试 100分考60分 1&#xff1a;题库 二&#xff1a;技能考试 100分考60分 1&#xff1a;写文档 项目概述 功能描述 数据库设计 UML 绘 图 用例图 与 包图&#xff08;两个图&#xff09; 2&…

网络运维简介

目录 1.网络运维的定义 2.诞生背景 3.网络运维的重要性 4.优点 5.缺点 6.应用场景 6.1.十个应用场景 6.2.数据中心运维 7.应用实例 8.小结 1.网络运维的定义 网络运维&#xff08;Network Operations&#xff09;是指管理、监控和维护计算机网络以确保其高效、安全和…

校园安保巡逻机器人

2023年8月5日&#xff0c;陕西西安一高校实验室起火冒烟&#xff0c;导致学校化学实验室发生火灾。2022年8月3日&#xff0c;一名歹徒持械闯入江西吉安安福县城的一家私立幼儿园&#xff0c;对着无辜的幼儿行凶伤人&#xff0c;造成3死6伤。 像这样的事故有不断地发生&#xf…

2024首发!会声会影2024旗舰版,专业编辑新体验!

会声会影2024最新旗舰版是一款专业的视频编辑软件&#xff0c;它集成了多种高级功能&#xff0c;为用户带来极致的视频编辑体验。在这篇文章中&#xff0c;我们将详细介绍该软件的功能和特色&#xff0c;帮助用户更好地了解和使用它。 会声会影全版本绿色安装包获取链接&#…