第4章:检查套餐管理-03-定时设置套餐

发布时间:2026/8/13 20:56:51
第4章:检查套餐管理-03-定时设置套餐 4. 定时任务组件Quartz4.1 Quartz介绍Quartz是Job scheduling作业调度领域的一个开源项目Quartz既可以单独使用也可以跟spring框架整合使用在实际开发中一般会使用后者。使用Quartz可以开发一个或者多个定时任务每个定时任务可以单独指定执行的时间例如每隔1小时执行一次、每个月第一天上午10点执行一次、每个月最后一天下午5点执行一次等。官网http://www.quartz-scheduler.org/maven坐标!--spring boot集成quartz-- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-quartz/artifactId /dependency4.2 Quartz入门案例本案例基于Quartz和spring整合的方式使用。具体步骤创建SpringBoot工程quartzdemo不依赖父工程1导入Quartz和springBoot相关坐标pom.xml文件如下?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion groupIdcom.liusp/groupId artifactIdquartzdemo/artifactId version0.0.1-SNAPSHOT/version packagingwar/packaging namequartzdemo/name descriptionDemo project for Spring Boot/description properties java.version1.8/java.version project.build.sourceEncodingUTF-8/project.build.sourceEncoding project.reporting.outputEncodingUTF-8/project.reporting.outputEncoding spring-boot.version2.3.7.RELEASE/spring-boot.version /properties dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-tomcat/artifactId scopeprovided/scope /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope exclusions exclusion groupIdorg.junit.vintage/groupId artifactIdjunit-vintage-engine/artifactId /exclusion /exclusions /dependency !--spring boot集成quartz-- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-quartz/artifactId /dependency /dependencies dependencyManagement dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-dependencies/artifactId version${spring-boot.version}/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement build plugins plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-compiler-plugin/artifactId version3.8.1/version configuration source1.8/source target1.8/target encodingUTF-8/encoding /configuration /plugin plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId version2.3.7.RELEASE/version configuration mainClasscom.liusp.QuartzdemoApplication/mainClass /configuration executions execution idrepackage/id goals goalrepackage/goal /goals /execution /executions /plugin /plugins /build /project2自定义一个Job下的Jobemo.javajob.JobDemopackage com.liusp.job; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; /** * 自定义Job */ Component public class JobDemo { Scheduled(cron 0/10 * * * * ?) public void run(){ System.out.println(job execute...); } }3SpringBoot 启动类添加注解EnableScheduling //开启基于注解的定时任务4启动服务观察控制台定时任务的执行job execute…job execute…执行上面main方法观察控制台可以发现每隔10秒会输出一次说明每隔10秒自定义Job被调用一次。4.3 cron表达式上面的入门案例中我们指定了一个表达式0/10 * * * * ?这种表达式称为cron表达式通过cron表达式可以灵活的定义出符合要求的程序执行的时间。本小节我们就来学习一下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某域上允许的最后一个值。只能使用在日和周域上。当用在日域上表示的是在月域上指定的月份的最后一天。用于周域上时表示周的最后一天就是星期六WW 字符代表着工作日 (星期一到星期五)只能用在日域上它用来指定离指定日的最近的一个工作日C允许在日期域和星期域出现。这个字符依靠一个指定的“日历”。也就是说这个表达式的值依赖于相关的“日历”的计算结果如果没有“日历”关联则等价于所有包含的“日历”。如日期域是“5C”表示关联“日历”中第一天或者这个月开始的第一天的后5天。星期域是“1C”表示关联“日历”中第一天或者星期的第一天的后1天也就是周日的后一天周一。4.4 cron表达式在线生成器前面介绍了cron表达式但是自己编写表达式还是有一些困难的我们可以借助一些cron表达式在线生成器来根据我们的需求生成表达式即可。http://cron.qqe2.com/5. 定时清理垃圾图片前面我们已经完成了体检套餐的管理在新增套餐时套餐的基本信息和图片是分两次提交到后台进行操作的。也就是用户首先将图片上传到七牛云服务器然后再提交新增窗口中录入的其他信息。如果用户只是上传了图片而没有提交录入的其他信息此时的图片就变为了垃圾图片因为在数据库中并没有记录它的存在。此时我们要如何处理这些垃圾图片呢解决方案就是通过定时任务组件定时清理这些垃圾图片。为了能够区分出来哪些图片是垃圾图片我们在文件上传成功后将图片保存到了一个redis集合中当套餐数据插入到数据库后我们又将图片名称保存到了另一个redis集合中通过计算这两个集合的差值就可以获得所有垃圾图片的名称。本章节我们就会基于Quartz定时任务通过计算redis两个集合的差值找出所有的垃圾图片就可以将垃圾图片清理掉。操作步骤1创建springBoot工程health_jobs打包方式为war导入Quartz等相关坐标pom.xml依赖包?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion groupIdcom.liusp/groupId artifactIdhealth_jobs/artifactId version0.0.1-SNAPSHOT/version packagingwar/packaging namehealth_jobs/name descriptionDemo project for Spring Boot/description properties java.version1.8/java.version project.build.sourceEncodingUTF-8/project.build.sourceEncoding project.reporting.outputEncodingUTF-8/project.reporting.outputEncoding spring-boot.version2.3.7.RELEASE/spring-boot.version /properties dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-tomcat/artifactId scopeprovided/scope /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope exclusions exclusion groupIdorg.junit.vintage/groupId artifactIdjunit-vintage-engine/artifactId /exclusion /exclusions /dependency dependency groupIdcom.liusp/groupId artifactIdhealth_interface/artifactId version0.0.1-SNAPSHOT/version /dependency !-- 引入redis-- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependency !--spring boot集成quartz-- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-quartz/artifactId /dependency /dependencies dependencyManagement dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-dependencies/artifactId version${spring-boot.version}/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement build plugins plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-compiler-plugin/artifactId version3.8.1/version configuration source1.8/source target1.8/target encodingUTF-8/encoding /configuration /plugin plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId version2.3.7.RELEASE/version configuration mainClasscom.liusp.HealthJobsApplication/mainClass /configuration executions execution idrepackage/id goals goalrepackage/goal /goals /execution /executions /plugin /plugins /build /project2SpringBoot启动类添加注解EnableScheduling //开启基于注解的定时任务3配置application.ymlserver: port: 88 #redis配置 spring: redis: host: 127.0.0.14自定义Job实现定时清理垃圾图片job.ClearImgJobpackage com.liusp.job; import com.liusp.constant.RedisConstant; import com.liusp.utils.QiniuUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.Set; /** * 自定义Job实现定时清理垃圾图片 */ Component public class ClearImgJob { Autowired StringRedisTemplate redisTemplate; //操作k-v都是字符串的 Scheduled(cron 0/10 * * * * ?) public void clearImg(){ //根据Redis中保存的两个set集合进行差值计算获得垃圾图片名称集合 //sdiff方法是计算两个集合的差值 SetString set redisTemplate.opsForSet().difference(RedisConstant.SETMEAL_PIC_RESOURCES, RedisConstant.SETMEAL_PIC_DB_RESOURCES); if(set ! null){ for (String picName : set) { //删除七牛云服务器上的图片 QiniuUtils.deleteFileFromQiniu(picName); //从Redis集合中删除图片名称 redisTemplate.opsForSet(). remove(RedisConstant.SETMEAL_PIC_RESOURCES,picName); System.out.println(自定义任务执行清理垃圾图片picName); } } } }