springboot 整合quartz定时任务

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、pom的配置
    • 1.加注解
  • 二、使用方法
    • 1.工程图
    • 2.创建工具类
  • 三、controller 实现


前言

提示:这里可以添加本文要记录的大概内容:

在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、pom的配置

 <dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.2</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version></dependency>

1.加注解

@EnableScheduling
public class BusinessApplication {public static void main(String[] args) {SpringApplication.run(BusinessApplication.class, args);log.info("*********启动成功************");}}

二、使用方法

1.工程图

在这里插入图片描述

2.创建工具类

package com.juyuan.api.scheduled_tasks.pojo;import lombok.Data;@Data
public class QuartzBean {//任务名称private String jobID ;//执行任务类private String jobClass;//cron表达式private String cron;
}
package com.juyuan.api.scheduled_tasks.jop;import org.quartz.*;
import org.springframework.scheduling.quartz.QuartzJobBean;import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Date;public class SimpleTask extends QuartzJobBean {@Overrideprotected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException{JobDetail jobDetail = jobExecutionContext.getJobDetail();JobKey key = jobDetail.getKey();System. out.println("任务名称为:"+key.getName()+",执行时间为:"+ LocalDateTime.now());System.out.println("=======================添加数据===================================");}}
package com.juyuan.api.scheduled_tasks.utils;import com.juyuan.api.scheduled_tasks.pojo.QuartzBean;
import org.quartz.*;
import org.quartz.impl.matchers.GroupMatcher;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;public class QuartzUtils {/**创建定时任务*@param scheduler 调度器*@param quartzBean 定时任务信息类*/@Beanpublic static void createScheduleJob(Scheduler scheduler, QuartzBean quartzBean){try {Class<? extends Job> aClass = (Class<? extends Job>) Class.forName(quartzBean.getJobClass());JobDetail build = JobBuilder.newJob(aClass).withIdentity(quartzBean.getJobID()).build();//表达式调度构建器CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(quartzBean.getCron());//按新的cronExpression表达式构建一个新的triggerCronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(quartzBean.getJobID()).withSchedule(cronScheduleBuilder).build();scheduler.scheduleJob(build,trigger);} catch (ClassNotFoundException | SchedulerException e) {throw new RuntimeException(e);}}/*根据任务恢复定时任务@param scheduler 调度器任务名称* param jobName*/public static void resumeScheduleJob(Scheduler scheduler, String jobName) {JobKey jobKey = JobKey.jobKey(jobName);try {scheduler.resumeJob(jobKey);} catch (SchedulerException e) {throw new RuntimeException("恢复定时任务失败" + e.getMessage());}}/*** 暂停定时任务*/public static void pauseScheduleJob(Scheduler scheduler, String jobName) {JobKey jobKey = JobKey.jobKey(jobName);try {scheduler.pauseJob(jobKey);} catch (SchedulerException e) {throw new RuntimeException("暂停定时任务失败" + e.getMessage());}}/*** 立即执行定时任务*/public static void runScheduleJob(Scheduler scheduler, String jobName) {JobKey jobKey = JobKey.jobKey(jobName);try {scheduler.triggerJob(jobKey);} catch (SchedulerException e) {throw new RuntimeException("立即执行定时任务失败" + e.getMessage());}}/*** 删除定时任务*/public static void deleteScheduleJob(Scheduler scheduler, String jobName) {JobKey jobKey = JobKey.jobKey(jobName);try {scheduler.deleteJob(jobKey);} catch (SchedulerException e) {throw new RuntimeException("删除定时任务失败" + e.getMessage());}}/*** 获取所有定时任务** @param scheduler 调度器* @return 返回所有定时任务列表*/public static List<JobDetail> getAllScheduleJob(Scheduler scheduler) {try {// 获取所有的JobKeysSet<JobKey> jobKeys = scheduler.getJobKeys(GroupMatcher.anyGroup());// 创建一个列表来存储所有的JobDetail对象List<JobDetail> jobDetails = new ArrayList<>();// 遍历每个JobKey,获取对应的JobDetailfor (JobKey jobKey : jobKeys) {JobDetail jobDetail = scheduler.getJobDetail(jobKey);jobDetails.add(jobDetail);}// 现在,jobDetails列表包含了所有的JobDetail对象// 您可以在这里对这些对象进行处理return jobDetails;} catch (SchedulerException e) {throw new RuntimeException("获取所有定时任务失败" + e.getMessage());}}/*** 获取所有正在运行的定时任务** @param scheduler 调度器* @return 返回所有正在运行的定时任务列表*/public static List<JobDetail> getRunningScheduleJob(Scheduler scheduler) {try {List<JobExecutionContext> executingJobs = scheduler.getCurrentlyExecutingJobs();List<JobDetail> jobDetails = new ArrayList<>();for (JobExecutionContext executingJob : executingJobs) {JobDetail jobDetail = executingJob.getJobDetail();jobDetails.add(jobDetail);}return jobDetails;} catch (SchedulerException e) {throw new RuntimeException("获取所有正在运行的定时任务失败" + e.getMessage());}}/*** 修改定时任务* @param scheduler 调度器*/public static void updateScheduleJob(Scheduler scheduler, QuartzBean quartzBean) {//获取对应的jobKeyTriggerKey triggerKey = TriggerKey.triggerKey(quartzBean.getJobID());//获取执行定时任务的执行方式CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(quartzBean.getCron());try {//按新的cronExpression表达式重新构建triggerCronTrigger character= (CronTrigger)scheduler.getTrigger(triggerKey);character = character.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();//按新的trigger重新设置job执行scheduler.rescheduleJob(triggerKey, character);} catch (SchedulerException e) {throw new RuntimeException(e);}}}

三、controller 实现

package com.juyuan.api.scheduled_tasks.controller;import com.juyuan.api.park_enterprise_public_construction.entity.ActionPlan;
import com.juyuan.api.park_enterprise_public_construction.service.ActionPlanService;
import com.juyuan.api.scheduled_tasks.pojo.QuartzBean;
import com.juyuan.api.scheduled_tasks.utils.QuartzUtils;import com.juyuan.framework.common.constants.WebConstant;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
public class QuartzBeanController {private final String PATH = WebConstant.API_PATH + "/quartz/";@Autowiredprivate Scheduler scheduler;@Autowiredprivate ActionPlanService actionPlanService;//新增执行定时任务@GetMapping(value = PATH + "add")public void add() {List<ActionPlan> list = actionPlanService.list();for (ActionPlan actionPlan : list) {QuartzBean quartzBean = new QuartzBean();quartzBean.setJobID(actionPlan.getId());quartzBean.setJobClass("com.juyuan.api.scheduled_tasks.jop.SimpleTask");quartzBean.setCron(actionPlan.getFrequency());QuartzUtils.createScheduleJob(scheduler,quartzBean);}}//暂停执行定时任务@GetMapping(value = PATH + "pause")public void pause() {QuartzUtils.pauseScheduleJob(scheduler,"2");}//恢复执行定时任务@GetMapping(value = PATH + "resume")public void resume() {QuartzUtils.resumeScheduleJob(scheduler,"1");}//删除执行定时任务@GetMapping(value = PATH + "delete")public void delete() {QuartzUtils.deleteScheduleJob(scheduler,"2");}//立即执行定时任务@GetMapping(value = PATH + "run")public void run() {QuartzUtils.runScheduleJob(scheduler,"2");}//获取所有定时任务// 获取所有定时任务的接口@GetMapping(value = PATH + "queryAll")public void queryAll() {// 获取所有定时任务列表List<JobDetail> allScheduleJob = QuartzUtils.getAllScheduleJob(scheduler);// 遍历所有定时任务allScheduleJob.forEach(jobDetail -> {// 打印任务名称System.out.println(jobDetail.getKey().getName());// 打印任务组名// System.out.println(jobDetail.getKey().getGroup());// 打印任务描述// System.out.println(jobDetail.getDescription());// 打印任务类名// System.out.println(jobDetail.getJobClass());// 打印任务数据映射// System.out.println(jobDetail.getJobDataMap());});}//修改执行定时任务@GetMapping(value = PATH + "update")public void update() {QuartzBean quartzBean = new QuartzBean();quartzBean.setCron("0/5 * * * *?");quartzBean.setJobID("2");QuartzUtils.updateScheduleJob(scheduler,quartzBean);}}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

实现拖动标题栏窗口恢复+窗口跟着鼠标移动

窗口跟着鼠标移动 1.重写鼠标按下事件&#xff0c;记录鼠标在窗口中的相对位置 2.重写鼠标移动事件&#xff0c;调用move方法使得窗口移动到鼠标的位置&#xff08;调用globalPos方法获取鼠标的位置&#xff09; 3.注意点&#xff1a;移动时鼠标的位置还要减去一开始的相对位…

一文带你全面了解RAID技术:从基础到进阶的全景解析

一、引言 在如今这个数据爆炸的时代&#xff0c;数据的存储和安全性显得尤为重要。RAID技术作为一种将多块硬盘组合成一个逻辑单元&#xff0c;以实现数据冗余和性能优化的技术&#xff0c;被广泛应用于企业级和个人数据存储中。本文将对RAID的常见级别进行详细解析&#xff0…

[C语言]第九节 函数一基础知识到高级技巧的全景探索

目录 9.1 函数的概念 9.2 库函数 9.2.1 标准库与库函数 示例&#xff1a;常见库函数 9.2.2 标准库与头文件的关系 参考资料和学习工具 如何使用库函数 ​编辑 9.3 ⾃定义函数 9.3.1 函数的语法形式 9.3.2函数的举例 9.4 实参与形参 9.4.1 什么是实参&#xff1f; 9…

影刀RPA实战:网页爬虫之CSDN博文作品数据

今天我们使用影刀来采集网页数据&#xff0c;影刀RPA是一款功能强大的自动化办公软件&#xff0c;它可以模拟人工的各种操作&#xff0c;帮助企业自动处理大量重复性、有逻辑规则的工作。影刀RPA在网页数据采集方面表现出色&#xff0c;能够实现对任何桌面软件、Web程序的自动化…

NeMo Curator 整理用于 LLM 参数高效微调的自定义数据集

目录 概述 预备知识 定义自定义文档构建器 下载数据集 解析和迭代数据集 将数据集写入 JSONL 格式 使用文档构建器加载数据集 使用现有工具统一 Unicode 格式 设计自定义数据集过滤器 编辑所有个人识别信息 添加指令提示 整合管线 概述 出于演示目的&#xff0c;本…

6芯7芯可旋转电连接器航空插头

概述 可旋转电航空插头是一种能够在旋转或相对运动的部件间稳定传输电气信号或电源的装置&#xff0c;广泛应用于航空航天、自动化设备、医疗设备等多个领域。它的核心在于精密的接触系统&#xff0c;由旋转端和固定端两部分组成&#xff0c;通过金属触点或导电环实现电气连接。…

哪些网站用python开发

国内的话&#xff0c;知乎&#xff0c;网易&#xff0c;腾讯&#xff0c;搜狐&#xff0c;金山&#xff0c;豆瓣这些属于用Python比较知名的。大型的项目的话&#xff0c;网易的许多游戏&#xff0c;腾讯的某些网站&#xff0c;搜狐的邮箱&#xff0c;金山的测试框架等等都是或…

实习期间git的分枝管理以及最常用的命令

各位找工作实习的友友在工作之前一定要把git的相关知识掌握呀&#xff0c;我实现期间被leader说过关于git规范的相关问题了 目前已更新系列&#xff1a; 当前&#xff1a;:实习期间git的分枝管理以及最常用的命令 Redis高级-----持久化AOF、RDB原理 Redis高级---面试总结5种…

【JavaEE初阶】多线程(4)

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 线程安全的 第四个原因 代码举例: 分析原因 解决方法 方法1 方法2 wait(等待)和notify(通知) wait和sleep区别 线程安全的 第四个原因 内存可见性,引起的线程安全问…

springboot3.X版本集成mybatis遇到的问题

由于我本地springboot为3.x版本&#xff0c;如下图所示&#xff0c;最新版本 当我参照如下搜索的内容去集成mybatis的时候&#xff0c;会出现各种各样的报错 最根本的原因是搜出来的配置是参照springboot2.X版本&#xff0c;当我们使用springboot3.x版本之后&#xff0c;需要配…

JVM 垃圾回收机制和GC案例分析

1. 引言 Java 虚拟机&#xff08;JVM&#xff09;的垃圾回收&#xff08;Garbage Collection, GC&#xff09;机制&#xff0c;是自动内存管理的重要组成部分。它通过回收不再使用的对象&#xff0c;避免手动释放内存的麻烦。然而&#xff0c;随着系统复杂性的增加&#xff0c…

4.C_数据结构_队列

概述 什么是队列&#xff1a; 队列是限定在两端进行插入操作和删除操作的线性表。具有先入先出(FIFO)的特点 相关名词&#xff1a; 队尾&#xff1a;写入数据的一段队头&#xff1a;读取数据的一段空队&#xff1a;队列中没有数据&#xff0c;队头指针 队尾指针满队&#…

劳特巴赫ICD调试器CMM调用烧录框架固件研究之C语言版本

接到客户一个项目是基本GD32F301C8XX的,尝试用手上的劳特巴赫仿真器对它进行开发操作,发现总是提示“FLASH algorithm did not execute completely” 怀疑是底层调用用烧录固件“~~/demo/arm/flash/word/stm32f300.bin”与芯片不兼容造成的,于是有了这编研究文档,多的不说直…

Spring4-IoC2-基于注解管理bean

目录 开启组件扫描 使用注解定义bean Autowired注入 场景一&#xff1a;属性注入 场景二&#xff1a;set注入 场景三&#xff1a;构造方法注入 场景四&#xff1a;形参注入 场景五&#xff1a;只有一个构造函数&#xff0c;无注解 场景六&#xff1a;Autowired和Quali…

Tcl lnit error: Can’t find a usable init.tcl in the following directories 问题解决

这个问题出现在我用py2exe打包了一个包含tkinter的图形化界面&#xff0c;在当前电脑上运行无问题&#xff0c;在移动到新电脑上后提示报错、 这里吐槽一下&#xff0c;新电脑上报错信息一闪而过&#xff0c;我用的土法子解决的&#xff0c;就是录视频然后0.25倍速度暂定找到报…

Acrobat 9 安装教程

软件介绍 Adobe Acrobat 是由Adobe公司开发的一款PDF&#xff08;Portable Document Format&#xff0c;便携式文档格式&#xff09;编辑软件。借助它&#xff0c;可以以PDF格式制作和保存文档&#xff0c;以便于浏览和打印&#xff0c;同时还可以使用一些高级工具来创建、编辑…

Qt 菜单栏、工具栏、状态栏、标签、铆接部件(浮动窗口) 设置窗口核心部件(文本编辑控件)的基本使用

效果 代码 #include "mainwindow.h" #include "ui_mainwindow.h" #include<QToolBar> #include<QDebug> #include<QPushButton> #include<QStatusBar> #include<QLabel> #include<QDockWidget> #include<QTextEdi…

将事物分为三教九流?不妨通过logistic回归

和多元线性回归一样&#xff0c;逻辑回归也是建立“多对一”型变量之间的线性关系——也即找出线性方程的近似解。有所不同的是&#xff0c;逻辑回归的解只能出现0~1之间&#xff08;亦或就是0/1两种结果&#xff09;&#xff0c;这倒是有点像bool型和int型之间的区别了。实际上…

S32K3 工具篇7:如何使用VScode编译EB MCAL工程

S32K3 工具篇7&#xff1a;如何使用VScode编译EB MCAL工程 1. VScode工具与配置2. 使用VScode编译RTD MCAL工程2.1 使用EB tresos生成配置2.2 VScode 打开工程2.3 修改mk文件2.4 编译文件2.5 debug生成好的elf文件 对于EB配置的MCAL代码&#xff0c;通常是基于RTD去做&#xff…

GEO IGEO MEO介绍 和 北斗导航系统使用三轨道原因

GEO IGSO MEO基本轨道知识 中地球轨道&#xff08;MEO&#xff1a;Middle Earth Orbit&#xff09; 轨道高度2000-36000kmGPS、GLONASS都属于此类轨道 地球同步轨道&#xff08;或称对地静止轨道&#xff09;[同步转动] 轨道高度约为36000 km&#xff1b;此轨道上卫星运行方…