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

深入浅出,SpringBoot整合Quartz实现定时任务与Redis健康检测(一)

目录

前言

环境配置

Quartz

什么是Quartz?

应用场景

核心组件

Job

JobDetail

Trigger

CronTrigger

SimpleTrigger

Scheduler

任务存储

RAM

JDBC

导入依赖

 定时任务

销量统计

Redis检测

使用

​编辑

注意事项


前言

在悦享校园1.0中引入了Quartz框架实现了对于商家每日的销量统计功能,而目前项目已升级到SpringBoot版本,因此需要进行对应的代码进行调整。除此之外考虑到若Redis出现故障时或使用该项目不想要配置Redis时如何保证该项目正常启动呢?即当Redis出现故障时如何无缝切换到数据库查询数据而不是抛出错误信息?由于项目中整合Redis的客户端为Lettuce,因此可以考虑使定时任务实现对Redis服务的监测从而无感切换数据查询操作。

环境配置

JDK 1.8

Spring Boot 2.7.12

lettuce 6.1.10(包含在Spring-Boot-Starter-Data-Redis中)

Quartz 2.3.2

Quartz

什么是Quartz?

根据官方文档描述,Quartz 是一种功能丰富的,开放源码的作业调度库,可以在集成在任何的Java应用程序中,小到独立的应用程序,大到复杂的电子商务系统。 Quartz可以用来创建简单或复杂的日程安排执行几十,几百,甚至数以万计的作业数,作业被定义为标准的Java组件,可以通过编程使其执行。

应用场景

如文章开头所述,当我们需要统计店铺的每日销量或者每周销量时,可以通过一个定时任务来执行相应的操作。以及Redis由于长时间不使用时可能会造成客户端除此之外,也可以将Quartz使用到如定期发送消息通知,如获取每日天气进行邮件推送到指定客户等其它的操作。这些都可通过Quartz来实现。除此之外Quartz还能完成其它复杂的任务。

核心组件

Job

用于存放真正需要定时执行的任务逻辑

JobDetail

用于对任务信息的相关描述,如任务名称、任务分组等。需要注意的是,JobDetail中含有一个Key属性,该属性将通过传入的任务名称和分组名称构建Key,若参数为空时则通过UUID来构建,从而确保该Key是唯一的。因此相同的任务名称和组名会覆盖之前的任务,这一点是需要注意的。

使用JobDetail+Job方式的设计,可以避免在并发情况下,对同一个实例的访问问题。

可以通过JobDataMap将数据存储并将数据传给Job实例。

Trigger

Trigger即为触发器,用于指定将以何种方式执行定时任务,注意Trigger与JobDetail一一对应,即一个触发器只做用于一个定义任务上。以下为两种常用的触发器:

CronTrigger

其核心在于使用Cron表达式进行任务的构建,如下是一个表示每月最后一天执行任务的Cron表达式:

# 每月的最后1天0 0 L * * *说明:Linux*    *    *    *    *-    -    -    -    -|    |    |    |    ||    |    |    |    +----- day of week (0 - 7) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat|    |    |    +---------- month (1 - 12) OR jan,feb,mar,apr ...|    |    +--------------- day of month (1 - 31)|    +-------------------- hour (0 - 23)+------------------------- minute (0 - 59)

鉴于网上关于Cron表达式的文章非常多,这里不做过多赘述。这里列举几个常用的Cron表达式:

(1)0/2 * * * * ?   表示每2秒 执行任务

(2)0 0/2 * * * ?    表示每2分钟 执行任务

(3)0 0 2 1 * ?   表示在每月的1日的凌晨2点调整任务

(4)0 15 10 ? * MON-FRI   表示周一到周五每天上午10:15执行作业

(5)0 0 10,14,16 * * ?   每天上午10点,下午2点,4点 

(5)0 0/30 9-17 * * ?   朝九晚五工作时间内每半小时

可以通过Crontab.guru - The cron schedule expression editor 网站来验证Cron表达式。

SimpleTrigger

相比于上述提到的Cron表达式,SimpleTrigger来构建一些指定间隔时间执行的任务更加容易,如每隔75s执行某个任务,则使用SimpleTrigger更佳。

Scheduler

任务调度器,它可以JobDetail与Trigger关联起来,通过任务调度器将启动任务的执行。一个任务调度器中可以包含多个关联的实例。

任务存储

Quartz提供了两种定时任务存储功能,一种为RAM,另一种为JDBC。

RAM

默认情况下Quartz会将任务数据存储到内存中,优点为任务读取速度快,简单易用。但缺点是随着服务重启会导致任务丢失。(本文采用该方式)

JDBC

Quartz提供了对定时任务持久化的功能,可以通过创建对应的数据表将定时任务持久化到数据库中,如此一来可以确保任务不会因为服务重启而丢失,可以更好的管理任务。缺点是需要额外的进行数据库表创建。本文采用默认的RAM方式存储,可以自行通过具体需求场景来选择。

导入依赖

由于本文项目使用了SpringBoot,因此导入如下依赖即可

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

 定时任务

任务创建可以通过继承 QuartzJobBean 类并重写其excuteInternal方法,或实现 Job 接口的excute方法,从QuartzJobBean的源码可知,其实现了Job接口,因此以上的创建方式任选其一即可。  

销量统计

销量统计任务类,此处仅使用日志打印体现,具体的业务逻辑可自行编写

@Slf4j
public class SellDailyJob extends QuartzJobBean {@Overrideprotected void executeInternal(JobExecutionContext context) throws JobExecutionException {log.info("这是每日销量统计定时任务。。。");}
}

执行规则配置类

@Configuration
public class SellDailyConfig{@Bean("sellDailyJob")public JobDetail jobDetail(){// 指定任务执行的类return JobBuilder.newJob(SellDailyJob.class)// 任务名称和分组名,不可重复.withIdentity("sellDailyJob", "group").withDescription("任务描述:内存方式运行").storeDurably().build();}@Bean("sellDailyTrigger")public Trigger trigger() {return TriggerBuilder.newTrigger()// 触发器名和分组名,不可重复.withIdentity("trigger", "group").forJob(jobDetail()).startNow()// 使用Cron表达式构建执行事件 每5s执行一次.withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")).build();}}

Redis检测

Redis健康检测定时任务类,构建方法同上

@Slf4j
public class RedisCheckJob extends QuartzJobBean {@Overrideprotected void executeInternal(JobExecutionContext context) throws JobExecutionException {log.info("这是Redis定时心跳任务");}
}

执行规则配置类

@Configuration
@Slf4j
public class RedisCheckConfig {// 指定生成的Bean实例对象名称@Bean("redisCheck")public JobDetail jobDetail() {return JobBuilder.newJob(RedisCheckJob.class)// 任务名和任务分组.withIdentity("RedisCheckJob", "group").withDescription("任务描述:内存方式运行").storeDurably().build();}@Bean("redisTrigger")public Trigger trigger() {return TriggerBuilder.newTrigger()// 触发器名称和分组.withIdentity("redisCheck", "group").forJob(jobDetail()).startNow()// 使用SimpleSchedule构建定时任务.withSchedule(SimpleScheduleBuilder.simpleSchedule()// 每隔10s执行任务.withIntervalInSeconds(10)// 永不过期.repeatForever()).build();}
}

使用

上个部分中分别使用CronTrigger和SimpleTrigger构建了两种定时任务,而根据SpringBoot官方文档中所示,当Quartz可用时,SchedulerFactoryBean会将Scheduler自动装配到容器中,因此在SpringBoot中使用@Configuration+@Bean注解构建定时任务后,无需显式创建Scheduler,SpringBoot会自动加载这些定时任务交由Scheduler调度。

因此配置完成后只需启动应用程序即可,执行结果如下所示。

注意事项

1.以上构建定时任务时需要创建任务类并在其中写入自定义的业务方法。并在配置类newJob中写入对应任务类。jobDetail和Trigger方法使用@Bean注解构建时,需要指定名称且不重复,否则其它配置类无法正常构建Bean实例。

2.jobDetail方法和trigger方法中的withIdentity分别指定不同任务名和任务分组,需要保证其它配置类中以上两个属性之中至少有一个属性不同,否则同样将造成定时任务无法正常执行。(eg:A配置类中的任务名为work,分组名为group,B中配置与之相同则会导致A服务无法正常运行)

相关文章:

深入浅出,SpringBoot整合Quartz实现定时任务与Redis健康检测(一)

目录 前言 环境配置 Quartz 什么是Quartz&#xff1f; 应用场景 核心组件 Job JobDetail Trigger CronTrigger SimpleTrigger Scheduler 任务存储 RAM JDBC 导入依赖 定时任务 销量统计 Redis检测 使用 ​编辑 注意事项 前言 在悦享校园1.0中引入了Quart…...

Lucene-MergePolicy详解

简介 该文章基于业务需求背景&#xff0c;因场景需求进行参数调优&#xff0c;下文会尽可能针对段合并策略&#xff08;SegmentMergePolicy&#xff09;的全参数进行说明。 主要介绍TieredMergePolicy&#xff0c;它是Lucene4以后的默认段的合并策略&#xff0c;之前采用的合并…...

数据的加解密

文章目录 分类特点业务的使用补充 分类 对称加密算法非对称加密算法 特点 对称加密算法 : 加密效率高 !加密和解密都使用同一款密钥 但是有一个问题 : 密钥如何从服务端发给客户端? (假如你直接先将密钥发给对方,要是在过程中被黑客技术破解了,那后面的消息也就泄漏了) (后…...

【Spring】更简单的读取和存储对象

更简单的读取和存储对象 一. 存储 Bean 对象1. 前置工作&#xff1a;配置扫描路径2. 添加注解存储 Bean 对象Controller&#xff08;控制器存储&#xff09;Service&#xff08;服务存储&#xff09;Repository&#xff08;仓库存储&#xff09;Component&#xff08;组件存储&…...

【LeetCode热题100】--108.将有序数组转换为二叉搜索树

108.将有序数组转换为二叉搜索树 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 二叉搜索树的中序遍历是升序…...

Redis学习笔记(下):持久化RDB、AOF+主从复制(薪火相传,反客为主,一主多从,哨兵模式)+Redis集群

十一、持久化RDB和AOF 持久化&#xff1a;将数据存入硬盘 11.1 RDB&#xff08;Redis Database&#xff09; RDB&#xff1a;在指定的时间间隔内将内存中的数据集快照写入磁盘&#xff0c;也就是行话讲的Snapshot快照&#xff0c;它恢复时是将快照文件直接读到内存里。 备份…...

【智能家居项目】裸机版本——设备子系统(LED Display 风扇)

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《智能家居项目》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 输入子系统中目前仅实现了按键输入&#xff0c;剩下的网络输入和标准输入在以后会逐步实现&am…...

[Linux]记录plasma-wayland下无法找到HDMI接口显示器的问题解决方案

内核&#xff1a;Linux 6.5.5-arch1-1 Plasma 版本&#xff1a;5.27.8 窗口系统&#xff1a;Wayland 1 问题 在前些时候置入了一块显示器&#xff0c;接口较多&#xff0c;有 HDMI 接口&#xff0c;type-C 接口。在 X11 中可以找到外接显示器&#xff0c;但是卡顿明显&#xf…...

【计算机网络】高级IO之select

文章目录 1. 什么是IO&#xff1f;什么是高效 IO? 2. IO的五种模型五种IO模型的概念理解同步IO与异步IO整体理解 3. 阻塞IO4. 非阻塞IOsetnonblock函数为什么非阻塞IO会读取错误&#xff1f;对错误码的进一步判断检测数据没有就绪时&#xff0c;返回做一些其他事情完整代码myt…...

如何设计一个高效的应用缓冲区【一个动态扩容的buffer类】

文章目录 前言一、为什么需要设计应用层缓冲区必须要有 output buffer目的问题output buffer的解决方案&#xff1a; 必须要有 input buffer总结 二、设计要点三、buffer设计思路基础函数关于iovec与readv readfd如何实现动态扩容 问题 前言 在上一个博客&#xff0c;我们介绍…...

图像处理初学者导引---OpenCV 方法演示项目

OpenCV 方法演示项目 项目地址&#xff1a;https://github.com/WangQvQ/opencv-tutorial 项目简介 这个开源项目是一个用于演示 OpenCV 方法的工具&#xff0c;旨在帮助初学者快速理解和掌握 OpenCV 图像处理技术。通过这个项目&#xff0c;你可以轻松地对图像进行各种处理&a…...

管道-匿名管道

一、管道介绍 管道&#xff08;Pipe&#xff09;是一种在UNIX和类UNIX系统中用于进程间通信的机制。它允许一个进程的输出直接成为另一个进程的输入&#xff0c;从而实现数据的流动。管道是一种轻量级的通信方式&#xff0c;用于协调不同进程的工作。 1. 创建和使用管道&#…...

【JavaEE基础学习打卡08】JSP之初次认识say hello!

目录 前言一、JSP技术初识1.动态页面2.JSP是什么3.JSP特点有哪些 二、JSP运行环境配置1.JDK安装2.Tomcat安装 三、编写JSP1.我的第一个JSP2.JSP执行过程3.在IDEA中开发JSP 总结 前言 &#x1f4dc; 本系列教程适用于JavaWeb初学者、爱好者&#xff0c;小白白。我们的天赋并不高…...

使用序列到序列深度学习方法自动睡眠阶段评分

深度学习方法&#xff0c;用于使用单通道脑电图进行自动睡眠阶段评分。 def build_firstPart_model(input_var,keep_prob_0.5):# List to store the output of each CNNsoutput_conns []######### CNNs with small filter size at the first layer ########## Convolutionnetw…...

【算法】排序——选择排序和交换排序(快速排序)

主页点击直达&#xff1a;个人主页 我的小仓库&#xff1a;代码仓库 C语言偷着笑&#xff1a;C语言专栏 数据结构挨打小记&#xff1a;初阶数据结构专栏 Linux被操作记&#xff1a;Linux专栏 LeetCode刷题掉发记&#xff1a;LeetCode刷题 算法头疼记&#xff1a;算法专栏…...

Docker 容器监控 - Weave Scope

Author&#xff1a;rab 目录 前言一、环境二、部署三、监控3.1 容器监控 - 单 Host3.2 容器监控 - 多 Host 总结 前言 Docker 容器的监控方式有很多&#xff0c;如 cAdvisor、Prometheus 等。今天我们来看看其另一种监控方式 —— Weave Scope&#xff0c;此监控方法似乎用的人…...

Spring Boot集成redis集群拓扑动态刷新

项目场景&#xff1a; Spring Boot集成Redis集群&#xff0c;使用lettuce连接Cluster集群实例。 问题描述 redis其中一个节点挂了之后&#xff0c;springboot集成redis集群配置信息没有及时刷新&#xff0c;出现读取操作报错。 java.lang.IllegalArgumentException: Connec…...

COCI2022-2023#1 Neboderi

P9032 [COCI2022-2023#1] Neboderi 题目大意 有一个长度为 n n n的序列 h i h_i hi​&#xff0c;你需要从中选择一个长度大于等于 k k k的子区间 [ l , r ] [l,r] [l,r]&#xff0c;使得 g ( h l h l 1 ⋯ h r ) g\times (h_lh_{l1}\cdotsh_r) g(hl​hl1​⋯hr​)最小&…...

由于找不到d3dx9_43.dll无法继续执行此代码怎么解决?全面解析d3dx9_43.dll

在使用计算机过程中&#xff0c;我们可能会遇到各种各样的问题。其中之一就是d3dx9_43.dll文件丢失的问题。这个问题通常会出现在运行某些应用程序或游戏时&#xff0c;导致程序无法正常启动或运行。那么&#xff0c;如何解决这个问题呢&#xff1f;小编将为您提供一些解决方案…...

Linux--网络编程-字节序

进程间的通信&#xff1a; 管道、消息队列、共享内存、信号、信号量。 特点&#xff1a;都依赖于linux内核。 缺陷&#xff1a;无法多机通信。 一、网络编程&#xff1a; 1、地址&#xff1a;基于网络&#xff0c;ip地址端口号。 端口号作用&#xff1a; 一台拥有ip地址的主机…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

WEB3全栈开发——面试专业技能点P7前端与链上集成

一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染&#xff08;SSR&#xff09;与静态网站生成&#xff08;SSG&#xff09; 框架&#xff0c;由 Vercel 开发。它简化了构建生产级 React 应用的过程&#xff0c;并内置了很多特性&#xff1a; ✅ 文件系…...

云安全与网络安全:核心区别与协同作用解析

在数字化转型的浪潮中&#xff0c;云安全与网络安全作为信息安全的两大支柱&#xff0c;常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异&#xff0c;并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全&#xff1a;聚焦于保…...