当前位置: 首页 > news >正文

spring boot集成quartz

目录

1.定时任务实现

2.quartz说明

3.存储方式

4.示例

5.定时任务的重新定制,恢复,暂停及删除


1.定时任务实现

定时任务的实现方式有很多,如下:

1.启动类中添加@EnableScheduling,开启定时任务功能,然后通过注解的方式,如

@Scheduled(cron = "0/1 * * * * ?")设置定时任务的执行方式,定时任务要设置成一个spring容器的bean

2.通过第三方框架的方式,如xxl-job,elastic-Job

3.通过quartz方式,第三方的框架也是基于quartz实现的。

2.quartz说明

quartz是完全有java开发的作业调度框架,包含一下几个核心概念:

(1)Scheduler

是quartz中的任务调度器,通过trigger和jobdetail进行调度,暂停和删除任务,相当于一个容器,装载着任务和触发器。Trigger 和 JobDetail 可以注册到 Scheduler 中,两者在 Scheduler 中拥有各自的组及名称,组及名称是 Scheduler 查找定位容器中某一对象的依据,Trigger 的组及名称必须唯一,JobDetail 的组和名称也必须唯一(但可以和 Trigger 的组和名称相同,因为它们是不同类型的)。

(2)trigger

Quartz 中的触发器,是一个类,描述触发 Job 执行的时间触发规则,主要有 SimpleTriggerCronTrigger 这两个子类。

(3)jobDetail

Quartz 中需要执行的任务详情,包括了任务的唯一标识和具体要执行的任务,可以通过 JobDataMap 往任务中传递数据。

(4)job

Quartz 中具体的任务,包含了任务的具体实现逻辑。

(5)JobBuilder 

用于创建一个任务实例,也可以定义关于该任务的详情比如任务名、组名等,这个声明的实例将会作为一个实际执行的任务。

(6)TriggerBuilder 

触发器创建器,用于创建触发器trigger实例。

(7)监听器组件

JobListener、TriggerListener、SchedulerListener监听器,用于对组件的监听。

3.存储方式

(1)RAMJobStore

默认情况下 Quartz 会将任务调度存储在内存中,这种方式性能是最好的,因为内存的速度是最快的。不好的地方就是数据缺乏持久性,但程序崩溃或者重新发布的时候,所有运行信息都会丢失。

(2)数据库方式

存储数据库后,可以做单点也可以做集群,当任务多了之后,可以统一进行管理,随时停止、暂停、修改任务。 关闭或者重启服务器,运行的信息都不会丢失。缺点就是运行速度快慢取决于连接数据库的快慢。

4.示例

(1)引入依赖

springboot项目可以直接引入下面依赖。

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

非springboot项目引入下面依赖,当然springboot项目也可以使用此依赖

<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.2.3</version>
</dependency>

 (2)开发定时任务

package com.example.demo.job;import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;/*** @Author linaibo* @Date 2023/11/17 16:52* @Version 1.0*/
public class SimpleJob extends QuartzJobBean {@Overrideprotected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {System.out.println("执行成功");}
}

定时任务继承QuartzJobBean,并实现其方法。

(3)配置定时任务

package com.example.demo.config;import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;/*** @Author linaibo* @Date 2023/11/17 16:54* @Version 1.0*/
@Configuration
@Order(2)
public class QuartzConfig implements ApplicationRunner {@Autowiredprivate Scheduler scheduler;@Overridepublic void run(ApplicationArguments args) throws Exception {try{String cron = "0/5 0/1 * * * ?";Class<? extends Job> jobClazz = (Class<? extends Job>)Class.forName("com.example.demo.job.SimpleJob");JobDetail jobDetail = JobBuilder.newJob(jobClazz).withIdentity("test").storeDurably().build();CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("test").startNow().withSchedule(CronScheduleBuilder.cronSchedule(cron)).build();scheduler.scheduleJob(jobDetail, cronTrigger);} catch (ClassNotFoundException e) {System.out.println("定时任务类路径出错:请输入类的绝对路径");} catch (SchedulerException e) {System.out.println("创建定时任务出错");}}
}

这里使用ApplicationRunner,简单说明一下:

ApplicationRunner常用于项目启动后,(也就是ApringApplication.run()执行结束),立马执行某些逻辑。可用于项目的准备工作,比如加载配置文件,加载执行流,定时任务等等。

使用方式:

实现ApplicationRunner接口,重写run方法,定义具体的执行逻辑

@Order注解,用于决定多个bean的执行顺序,按照值从小到大执行 (值可为负数)

@Order(-1)优先于@Order(0)
@Order(1)优先于@Order(2)

还有个接口,也可以实现和ApplicationRunner一样的功能

CommandLineRunner

CommandLineRunner接口的run方法接收的参数为String数组

创建配置文件实现ApplicationRunner接口,实现run方法,在方法中,首先通过反射方式获取到要执行定时任务的类来创建jobdetail,然后根据执行规则创建执行的触发器trigger,再将jobdetail和trigger放到scheduler容器中,按照规则进行任务的执行。

定时任务的全路径名称,执行的触发器以及任务名称,可以存放在数据库中,并在前端追加可视化画面来进行修改,删除及立即执行的功能。

定时任务的数据表可以自己设计,也可以参照官网,如下

初始化 Quartz 数据表

下载 Quartz 发布包:Downloads

解压缩进入SQL脚本所在位置:quartz-2.3.0-SNAPSHOT/src/org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql

导入 tables_mysql_innodb.sql 脚本文件。

5.定时任务的重新定制,恢复,暂停及删除

(1)重新定制

@Service
public class QuartzJobServiceImpl implements QuartzJobService {@Autowiredprivate Scheduler scheduler;@SneakyThrows@Overridepublic void rescheduleJob(String jobName, String jobGroupName, String cron) {TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroupName);CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).startNow().withSchedule(CronScheduleBuilder.cronSchedule(cron)).build();scheduler.rescheduleJob(triggerKey, cronTrigger);}

(2)恢复

@Service
public class QuartzJobServiceImpl implements QuartzJobService {@Autowiredprivate Scheduler scheduler;@SneakyThrows@Overridepublic void resumeJob(String jobName, String jobGroupName) {scheduler.resumeJob(JobKey.jobKey(jobName, jobGroupName));}
}

(3)暂停

@Service
public class QuartzJobServiceImpl implements QuartzJobService {@Autowiredprivate Scheduler scheduler;@SneakyThrows@Overridepublic void pauseJob(String jobName, String jobGroupName) {scheduler.pauseJob(JobKey.jobKey(jobName, jobGroupName));}
}

(4)删除

@Service
public class QuartzJobServiceImpl implements QuartzJobService {@Autowiredprivate Scheduler scheduler;@SneakyThrows@Overridepublic void deleteJob(String jobName, String jobGroupName) {scheduler.pauseTrigger(TriggerKey.triggerKey(jobName, jobGroupName));scheduler.unscheduleJob(TriggerKey.triggerKey(jobName, jobGroupName));scheduler.deleteJob(JobKey.jobKey(jobName, jobGroupName));}
}

参照:

Spring Boot 集成 Quartz(任务调度框架)_springboot集成quartz_人人都在发奋的博客-CSDN博客

springboot整合quartz项目使用(含完整代码)_springboot quartz-CSDN博客 

相关文章:

spring boot集成quartz

目录 1.定时任务实现 2.quartz说明 3.存储方式 4.示例 5.定时任务的重新定制&#xff0c;恢复&#xff0c;暂停及删除 1.定时任务实现 定时任务的实现方式有很多&#xff0c;如下&#xff1a; 1.启动类中添加EnableScheduling&#xff0c;开启定时任务功能&#xff0c;然…...

[Linux] yum仓库相关

一、yum仓库 1.1 yum简介 yum 是一种基于 RPM 软件包&#xff08;Red-Hat Package Manager 的缩写&#xff09;的软件更新机制&#xff0c;可自动解决软件包之间的依赖关系。这就解决了日常工作中花费大量时间寻找安装包的问题。 为什么会出现依赖 linux 本身就有简化系统的优…...

2023.11.15-hivesql之炸裂函数explode练习

把一个容器的多个数据炸裂出单独展示: explode(容器) 需求:将NBA总冠军球队数据使用explode进行拆分&#xff0c;并且根据夺冠年份进行倒序排序。 1.建表 --step1:建表 create table the_nba_championship(team_name string,champion_year array<string> ) row format…...

Linux - 内核 - 安全机制 - 内存页表安全

说明 内核页表安全的最终目标是&#xff1a;将内核使用到的内存页&#xff08;内核与module占用&#xff09;的属性&#xff08;读/写/可执行&#xff09;配置成安全的&#xff0c;即&#xff1a;代码段和rodata段只读&#xff0c;非代码段不能执行等&#xff0c;用来防御堆栈…...

Linux---(七)Makefile写进度条(三个版本)

文章目录 一、前提引入&#x1f397;️下面的代码什么现象&#xff1f;&#x1f397;️下面的代码什么现象&#xff1f; 二、缓冲区三、回车换行&#x1f397;️注意&#x1f397;️图解&#x1f397;️老式回车键造型&#xff08;意思是充当两个动作&#xff09;&#x1f397;…...

数据库分页查询

数据库只所以要分页查询&#xff0c;其实是界面显示的需要&#xff0c;不是数据库的需要。 数据库本身查询是很快的。本文章是针对这种情况的。 如果数据库本身查询慢&#xff0c;那是优化查询语句的事情了。不在本文章范围内。 今天遇到了这个问题。 是个老项目。在原有的查询…...

如何选择合适的数据库管理工具?Navicat Or DBeaver

写在前面 在阅读本文之前&#xff0c;糖糖给大家准备了Navicat和DBeaver安装包&#xff0c;在公众号内回复“Navicat”或“DBeaver”或"数据库管理工具"来下载。 引言 对于测试而言&#xff0c;在实际工作中往往会用到数据库&#xff0c;那么选择使用哪种类型的数…...

Opencv!!在树莓派上安装Opencv!

一、更新树莓派系统 sudo apt-get update sudo apt-get upgrade二、安装python-opencv sudo apt-get install libopencv-dev sudo apt-get install python3-opencv三、查看是否安装成功 按以下命令顺序执行&#xff1a; python import cv2 cv2.__version__如果出现版本号&a…...

三菱FX3U小项目—传输带定分级控制

目录 一、项目描述 二、IO口分配 三、项目程序 四、总结 一、项目描述 两条运输带顺序相连&#xff0c;为了避免运送的物料在1号运输线上堆积&#xff0c;所以启动时&#xff0c;1号运输带开始运行&#xff0c;5S后2号运输带自动启动。停机时顺序与启动刚好相反&#xff0c…...

实例解释遇到前端报错时如何排查问题

前端页面报错&#xff1a; 1、页面报错500&#xff0c;首先我们可以知道是服务端的问题&#xff0c;需要去看下服务端的报错信息&#xff1a; 2、首先我们查看下前端是否给后端传了id: 我们可以看到接口是把ID返回了&#xff0c;就需要再看下p_id是什么情况了。 3、我们再次请…...

微电影分销付费短剧小程序开发

微电影系统分销管理付费软件是一款面向微电影制作公司和影视产业的付费软件&#xff0c;它的出现旨在帮助微电影制作公司和影视产业实现分销管理&#xff0c;提高产业的效率和竞争力。本文将介绍微电影系统分销管理付费软件的背景、特点和开发方法。 一、背景 微电影作…...

时间序列预测中的4大类8种异常值检测方法(从根源上提高预测精度)

一、本文介绍 本文给大家带来的是时间序列预测中异常值检测&#xff0c;在我们的数据当中有一些异常值&#xff08;Outliers&#xff09;是指在数据集中与其他数据点显著不同的数据点。它们可能是一些极端值&#xff0c;与数据集中的大多数数据呈现明显的差异。异常值可能由于…...

Android---Gradle 构建问题解析

想必做 Android App 开发的对 Gradle 都不太陌生。因为有 Android Studio 的帮助&#xff0c;Android 工程师使用 Gradle 的门槛不算太高&#xff0c;基本的配置都大同小异。只要在 Android Studio 默认生成的 build.gradle 中稍加修改&#xff0c;就都能满足项目要求。但是&am…...

02-2解析JsonPath

一、jsonpath的安装及使用方式 pip安装 pip install jsonpathjsonpath的使用 obj json.load(open(json文件, r, encodingutf‐8)) ret jsonpath.jsonpath(obj, jsonpath语法)可以参考以下这篇博客进行jsonpath的简单入门JSONPath-简单入门...

Git拉取远程指定分支

git clone 指定分支-CSDN博客 即&#xff1a;git clone -b 分支名称 git地址 这种方法也是可以的。但是其实主分支也是拉取下来了&#xff0c;其他分支也拉取下来了&#xff0c;只不过所需分支也拉取下来并且对应当前工作区的代码。如果真的只拉取指定分支&#xff0c;可以用…...

使用Ant Design Pro开发时的一个快速开发接口请求的技巧

使用Ant Design Pro开发时的一个快速开发接口的技巧 当我们的后端在写好接口以后&#xff0c;我们通过swagger knife4j可以生成一个接口文档&#xff0c;后端启动以后&#xff0c;可以生成一个接口文档&#xff0c;当输入地址 localhost:8101/api/v3/api-docs &#xff08;这…...

m1 rvm install 3.0.0 Error running ‘__rvm_make -j8‘

在使用M1 在安装cocopods 前时&#xff0c;安装 rvm install 3.0.0遇到 rvm install 3.0.0 Error running __rvm_make -j8 备注: 该图片是借用其他博客图片&#xff0c;因为我的环境解决完没有保留之前错误信息。 解决方法如下&#xff1a; 1. brew uninstall --ignore-depe…...

对产品实现汇率换算服务(将两个CompletableFuture对象整合起来,无论它们是否存在依赖)

需求 有一家商店提供的价格是以欧元&#xff08;EUR&#xff09;计价的&#xff0c;但是你希望以美元的方式提供给你的客户。你可以用异步的方式向商店查询指定商品的价格&#xff0c;同时从远程的汇率服务那里查到欧元和美元之间的汇率。当二者都结束时&#xff0c;再将这两个…...

数据库期末考前复习题(单选+多选+判断+解答)

文章目录 #数据库考前复习题一、 选择1.单选题2.多选题 二、判断题三、解答请描述数据库中的三大范式关系型数据库ACID特性 #数据库考前复习题 一、 选择 1.单选题 1.使用limit进行分页查询&#xff0c;其中每页10条数据&#xff0c;查询第5页应该写为&#xff1f; SELECT *…...

Ubuntu22.04源码安装ROS-noetic(ROS1非ROS2),编译运行VINS-MONO

1. Ubuntu22.04源码编译安装ROS-noetic 由于22.04默认安装ROS2&#xff0c;但很多仓库都是基于ROS1的&#xff0c;不想重装系统&#xff0c;参考这两个博客安装了ROS-noetic&#xff1a; 博客1. https://blog.csdn.net/Drknown/article/details/128701624博客2. https://zhua…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

【51单片机】4. 模块化编程与LCD1602Debug

1. 什么是模块化编程 传统编程会将所有函数放在main.c中&#xff0c;如果使用的模块多&#xff0c;一个文件内会有很多代码&#xff0c;不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里&#xff0c;在.h文件里提供外部可调用函数声明&#xff0c;其他.c文…...

DeepSeek越强,Kimi越慌?

被DeepSeek吊打的Kimi&#xff0c;还有多少人在用&#xff1f; 去年&#xff0c;月之暗面创始人杨植麟别提有多风光了。90后清华学霸&#xff0c;国产大模型六小虎之一&#xff0c;手握十几亿美金的融资。旗下的AI助手Kimi烧钱如流水&#xff0c;单月光是投流就花费2个亿。 疯…...

GAN模式奔溃的探讨论文综述(一)

简介 简介:今天带来一篇关于GAN的,对于模式奔溃的一个探讨的一个问题,帮助大家更好的解决训练中遇到的一个难题。 论文题目:An in-depth review and analysis of mode collapse in GAN 期刊:Machine Learning 链接:...

嵌入式面试常问问题

以下内容面向嵌入式/系统方向的初学者与面试备考者,全面梳理了以下几大板块,并在每个板块末尾列出常见的面试问答思路,帮助你既能夯实基础,又能应对面试挑战。 一、TCP/IP 协议 1.1 TCP/IP 五层模型概述 链路层(Link Layer) 包括网卡驱动、以太网、Wi‑Fi、PPP 等。负责…...

背包问题双雄:01 背包与完全背包详解(Java 实现)

一、背包问题概述 背包问题是动态规划领域的经典问题&#xff0c;其核心在于如何在有限容量的背包中选择物品&#xff0c;使得总价值最大化。根据物品选择规则的不同&#xff0c;主要分为两类&#xff1a; 01 背包&#xff1a;每件物品最多选 1 次&#xff08;选或不选&#…...