记录Quartz在项目中的使用方式
创始人
2025-05-30 10:45:23

黑马传智健康项目中遇到的技术,感觉这个解决思路挺新颖的,就记录下来了。用到了redis、Quartz以及cron定时计划等知识点。

Quartz

  • 1 Quartz
  • 2. cron表达式
  • 3. Quartz Demo演示
    • 3.1 创建Maven项目
    • 3.2 在pom.xml中引入依赖
    • 3.3 编写JobDemo类
    • 3.4 提供Spring配置文件spring-jobs.xml,配置自定义Job、任务描述、触发器、调度工厂等
    • 3.5 配置web.xml文件,加载Spring容器
    • 3.6 编写main方法进行测试
  • 4. 项目实战记录
    • 4.1 创建maven工程health_jobs,打包方式为war,导入Quartz等相关坐标
    • 4.2 创建ClearImgJob定时任务类
    • 4.3 配置applicationContext-redis.xml
    • 4.4 配置applicationContext-jobs.xml
    • 4.5 配置web.xml
    • 4.6 测试

1 Quartz

什么是Quartz

QuartzOpenSymphony开源组织在Job scheduling领域又一个开源项目,完全由Java开发,可以用来执行定时任务,类似于java.util.Timer。但是相较于TimerQuartz增加了很多功能:

持久性作业 - 就是保持调度定时的状态;
作业管理 - 对调度作业进行有效的管理;

Quartz组件使用场景

拿火车票购票来说,当你下单后,后台就会插入一条待支付的task(job),一般是30分钟,超过30min后就会执行这个job,去判断你是否支付,未支付就会取消此次订单;当你支付完成之后,后台拿到支付回调后就会再插入一条待消费的task(job)Job触发日期为火车票上的出发日期,超过这个时间就会执行这个job,判断是否使用等

我在项目中使用Quartz的原因在于文件上传遇到的一些问题,问题描述:

在项目中有一个新增套餐功能,需要导入图片,这里导入图片成功后会自动上传到七牛云服务器中,那么如果我最后点击 “取消” 或者 “X” 新增的套餐数据就不会插入到数据库当中,但是图片已经上传到七牛云服务器上了,占用了资源空间,这里就需要我们按时去清理云服务器中的无用资源,释放空间。

在这里插入图片描述

(1)首先我们需要定义实现一个定时功能的接口,我们可以称之为Task(或Job),如定时发送邮件的task(Job),重启机器的task(Job),优惠券到期发送短信提醒的task(Job),实现接口如下:

在这里插入图片描述

(2)有了任务之后,还需要一个能够实现触发任务去执行的触发器,触发器Trigger最基本的功能是指定Job的执行时间,执行间隔,运行次数等。

在这里插入图片描述

(3)有了Job和Trigger后,怎么样将两者结合起来呢?即怎样指定Trigger去执行指定的Job呢?这时需要一个Schedule,来负责这个功能的实现。

在这里插入图片描述

上面三个部分就是Quartz的基本组成部分:

  1. 调度器:Scheduler
  2. 任务:JobDetail
  3. 触发器:Trigger,包括SimpleTriggerCronTrigger

2. cron表达式

在继续介绍Quartz之前,我们先来介绍一下cron表达式

Cron表达式是一个具有时间含义的字符串,字符串以5-6个空格隔开,分为6~7个域,格式为X X X X X X X。其中X是一个域的占位符。最后一个代表年份的域非必须,可省略。单个域有多个取值时,使用半角逗号,隔开取值。每个域可以是确定的取值,也可以是具有逻辑意义的特殊字符。每个域最多支持一个前导零。

cron表达式格式:

{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}

在这里插入图片描述

cron表达式分为七个域,之间使用空格分隔。其中最后一个域(年)可以为空。每个域都有自己允许的值和一些特殊字符构成。使用这些特殊字符可以使我们定义的表达式更加灵活。

下面是对这些特殊字符的介绍:

逗号(,):指定一个值列表,例如使用在月域上1,4,5,7表示1月、4月、5月和7月

横杠(-):指定一个范围,例如在时域上3-6表示3点到6点(即3点、4点、5点、6点)

星号(*):表示这个域上包含所有合法的值。例如,在月份域上使用星号意味着每个月都会触发

斜线(/):表示递增,例如使用在秒域上0/15表示每15秒

问号(?):只能用在日和周域上,但是不能在这两个域上同时使用。表示不指定

井号(#):只能使用在周域上,用于指定月份中的第几周的哪一天,例如6#3,意思是某月的第三个周五 (6=星期五,3意味着月份中的第三周)

L:某域上允许的最后一个值。只能使用在日和周域上。当用在日域上,表示的是在月域上指定的月份的最后一天。用于周域上时,表示周的最后一天,就是星期六

W:W 字符代表着工作日 (星期一到星期五),只能用在日域上,它用来指定离指定日的最近的一个工作日

cron表达式在线生成器: http://cron.qqe2.com/

在这里插入图片描述

3. Quartz Demo演示

3.1 创建Maven项目

在这里插入图片描述

3.2 在pom.xml中引入依赖

4.0.0org.examplequartz_demo1.0-SNAPSHOTwarquartz_demo Maven Webapphttp://www.example.comUTF-81.81.8org.springframeworkspring-context5.0.2.RELEASEorg.springframeworkspring-context-support5.0.2.RELEASEorg.springframeworkspring-tx5.0.2.RELEASEorg.springframeworkspring-web5.0.2.RELEASEorg.quartz-schedulerquartz2.2.1org.quartz-schedulerquartz-jobs2.2.1org.slf4jslf4j-simple1.7.25test

3.3 编写JobDemo类

在这里插入图片描述

3.4 提供Spring配置文件spring-jobs.xml,配置自定义Job、任务描述、触发器、调度工厂等


0/10 * * * * ?

3.5 配置web.xml文件,加载Spring容器

Archetype Created Web ApplicationcontextConfigLocationclasspath*:spring*.xmlorg.springframework.web.context.ContextLoaderListener

3.6 编写main方法进行测试

import org.springframework.context.support.ClassPathXmlApplicationContext;public class APP {public static void main(String[] args) {new ClassPathXmlApplicationContext("spring-jobs.xml");}
}

在这里插入图片描述

4. 项目实战记录

1.2小节Quartz的使用场景中,我们已经描述了我们的需求,需要定时清除七牛云服务器上无用的照片资源。

我们使用redis已经存储了上传到七牛云服务器上的照片名称集合SETMEAL_PIC_RESOURCES,如下所示:

在这里插入图片描述

我们使用redis已经存储了插入到数据库中的照片名称集合SETMEAL_PIC_DB_RESOURCES,如下所示:

在这里插入图片描述

那么集合 SETMEAL_PIC_RESOURCESSETMEAL_PIC_DB_RESOURCES 的差值即为需要在云服务器上清除的照片。

4.1 创建maven工程health_jobs,打包方式为war,导入Quartz等相关坐标

在这里插入图片描述

4.0.0org.examplehealth_parent1.0-SNAPSHOTorg.examplehealth_jobs1.0-SNAPSHOTwarhealth_jobs Maven Webapphttp://www.example.comUTF-81.81.8org.examplehealth_interface1.0-SNAPSHOTorg.quartz-schedulerquartzorg.quartz-schedulerquartz-jobsorg.apache.tomcat.maventomcat7-maven-plugin2.283/

4.2 创建ClearImgJob定时任务类

/*** 自定义Job,实现定时清理垃圾图片*/
public class ClearImgJob {@Autowiredprivate JedisPool jedisPool;public void clearImg(){//根据Redis中保存的两个set集合进行差值计算,获得垃圾图片名称集合Set set = jedisPool.getResource().sdiff(RedisConstant.SETMEAL_PIC_RESOURCES, RedisConstant.SETMEAL_PIC_DB_RESOURCES);if(set != null){for (String picName : set) {//删除七牛云服务器上的图片QiniuUtils.deleteFileFromQiniu(picName);//从Redis集合中删除图片名称jedisPool.getResource().srem(RedisConstant.SETMEAL_PIC_RESOURCES,picName);System.out.println(new Date());System.out.println("已经删除图片:" + picName);}}}
}

4.3 配置applicationContext-redis.xml


20050

4.4 配置applicationContext-jobs.xml


0/15 * * * * ?

4.5 配置web.xml


Archetype Created Web ApplicationcontextConfigLocationclasspath*:applicationContext*.xmlorg.springframework.web.context.ContextLoaderListener

4.6 测试

成功进行2次新增套餐,新增成功的图片名称保存在setmealPicDbResources, 在redis中显示如下:

在这里插入图片描述

添加图片后,进行4次取消,新增失败和成功的图片名称保存在setmealPicResources,在redis中显示如下:

在这里插入图片描述

查看七牛云服务器发现,无论套餐是否新增成功,图片都成功上传到了七牛云服务器中,这样就造成了资源的浪费,如下图所示:

在这里插入图片描述

运行health_jobs模块,开启定时清理垃圾图片,有运行结果可知未插入到数据库中的图片已经被删除。

在这里插入图片描述

刷新,再次查看七牛云服务器进行验证,发现已经删除成功。

在这里插入图片描述

相关内容

热门资讯

【入门5 字符串】P1125 ... [NOIP2008 提高组] 笨小猴 题目描述 笨小猴的词汇量很小,所以每次做英语选择...
运动会稿件200字,运动会演讲... 运动会稿件200字目录运动会稿件200字运动会演讲稿200字关于运动会的作文200字运动会通讯稿20...
现代圣达菲报价及图片(现代圣达... 今天给各位分享现代圣达菲报价及图片的知识,其中也会对现代圣达菲2014款图片进行解释,如果能碰巧解决...
一团什么什么 极速百科网 极速... 一团什么什么目录一团什么什么一团什么什么一团花瓣是什么成语一团什么成语一团什么什么 1. 一团...
火影忍者鸣人在第几集九尾化过,... 火影忍者鸣人在第几集九尾化过目录火影忍者鸣人在第几集九尾化过谁告诉我火影里鸣人变身九尾 都有哪几集鸣...
nmap——一种用于查看目标主... 正如标题所言,nmap(network mapper)是一...
SpringCloud微服务技... SpringCloud微服务技术栈.黑马跟学 五今日目标1.初识elasticsearch1.1.了...
2023官方发布最新Sprin... 文章目录1、SpringMVC概述1.1 SpringMVC概念1.2 SpringMVC原理1.3...
6.深入理解类 目录 6.1 类成员 6.2 成员修饰符的顺序 6.3 实例类成员  6.4 静态字段  6.5 ...
rdquo 云 ldquo 字... rdquo 云 ldquo 字加偏旁变成什么字目录rdquo 云 ldquo 字加偏旁变成什么字云字...
又双叒叕念什么啥意思 极速百科... 又双叒叕念什么啥意思目录又双叒叕念什么啥意思又双叒叕念什么啥意思又双叒叕念什么?啥意思?“又双叒叕”...
早安心向阳光正能量的句子,早安... 早安心向阳光正能量的句子目录早安心向阳光正能量的句子早安发圈吸引人的句子正能量早安语录正能量的句子有...
真心话关于爱情 极速百科网 极... 真心话关于爱情目录真心话关于爱情真心话关于爱情关于爱情最感动的真心话有那些?爱情的真心话问题大全真心...
windows下使用gitea... windows下使用gitea搭建git服务器 详细过程 1、简述 使用过好几个git服务器...
区块链安全:闪电贷 Flash... 闪电贷主要用于 DeFi 中,在介绍闪电贷之前先介绍一下 CeFi 的模式。 CeFi...
怎么简单的区分方向盘打几圈,怎... 怎么简单的区分方向盘打几圈目录怎么简单的区分方向盘打几圈怎样判断打方向盘的圈数学开车当别人把方向盘打...
天道经典语录,天道100句经典... 天道经典语录目录天道经典语录天道100句经典语录《天道》里王志文的一段词求全王志文在天道中的经典台词...
ce能修改网络游戏吗,ce可以... ce能修改网络游戏吗目录ce能修改网络游戏吗ce可以修改私服传奇吗一般的网页游戏 能用CE修改吗?有...
带雨字的成语,带雨的四字成语有... 带雨字的成语目录带雨字的成语带雨的四字成语有哪些带雨的四字词语有哪些?与雨有关的成语带雨字的成语 ...
IP 报文 IP报文 IP(Internet Protocol)报文是TCP/IP协...
一行 MD5 居然让小伙伴都回... 1. 前言 大家好,当你点开这篇文章的时候也许心想是哪个 XX 小编混到这里,先不要着急扔臭鸡蛋,本...
Baumer工业相机堡盟相机如... 项目场景 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场...
心动是什么感觉 极速百科网 极... 心动是什么感觉目录心动是什么感觉心动是什么感觉心动是什么样的感觉呢?心动是什么感觉?心动是什么感觉 ...
黄河全长大约多少千米,黄河全长... 黄河全长大约多少千米目录黄河全长大约多少千米黄河全长多少米黄河全长多少千米黄河全长大约多少千米 ...
kb是指什么,kb是什么意思 ... kb是指什么目录kb是指什么kb是什么意思kb什么意思kb什么意思?什么单词缩写?kb是指什么 ...
点头什么的四字词语,四字成语点... 点头什么的四字词语目录点头什么的四字词语四字成语点头什么四字成语 点头什么???形容点头的成语有哪些...
2023年半导体行业研究报告 第一章 行业概况 半导体是一种电子材料,可以控制电流的流动。半导体材料的特性是在它们的...
代理怎么做,如何做代理 极速百... 代理怎么做目录代理怎么做如何做代理做代理怎么做?酒店第三方代理怎么做代理怎么做 1. 确定代理...
怎样灭苍蝇最有效的方法,灭苍蝇... 怎样灭苍蝇最有效的方法目录怎样灭苍蝇最有效的方法灭苍蝇最有效的方法 灭苍蝇最有效3种方法如何做到有效...
【Java (一:12-2) ... Java反射机制一、反射1.反射的概念2.获取class对象3. 获取Constructor对象4....