設(shè)置套餐)
4. 定時(shí)任務(wù)組件Quartz4.1 Quartz介紹Quartz是Job scheduling作業(yè)調(diào)度領(lǐng)域的一個(gè)開(kāi)源項(xiàng)目Quartz既可以單獨(dú)使用也可以跟spring框架整合使用在實(shí)際開(kāi)發(fā)中一般會(huì)使用后者。使用Quartz可以開(kāi)發(fā)一個(gè)或者多個(gè)定時(shí)任務(wù)每個(gè)定時(shí)任務(wù)可以單獨(dú)指定執(zhí)行的時(shí)間例如每隔1小時(shí)執(zhí)行一次、每個(gè)月第一天上午10點(diǎn)執(zhí)行一次、每個(gè)月最后一天下午5點(diǎn)執(zhí)行一次等。官網(wǎng)http://www.quartz-scheduler.org/maven坐標(biāo)!--spring boot集成quartz-- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-quartz/artifactId /dependency4.2 Quartz入門案例本案例基于Quartz和spring整合的方式使用。具體步驟創(chuàng)建SpringBoot工程quartzdemo不依賴父工程1導(dǎo)入Quartz和springBoot相關(guān)坐標(biāo)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自定義一個(gè)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 啟動(dòng)類添加注解EnableScheduling //開(kāi)啟基于注解的定時(shí)任務(wù)4啟動(dòng)服務(wù)觀察控制臺(tái)定時(shí)任務(wù)的執(zhí)行job execute…job execute…執(zhí)行上面main方法觀察控制臺(tái)可以發(fā)現(xiàn)每隔10秒會(huì)輸出一次說(shuō)明每隔10秒自定義Job被調(diào)用一次。4.3 cron表達(dá)式上面的入門案例中我們指定了一個(gè)表達(dá)式0/10 * * * * ?這種表達(dá)式稱為cron表達(dá)式通過(guò)cron表達(dá)式可以靈活的定義出符合要求的程序執(zhí)行的時(shí)間。本小節(jié)我們就來(lái)學(xué)習(xí)一下cron表達(dá)式的使用方法。如下圖cron表達(dá)式分為七個(gè)域之間使用空格分隔。其中最后一個(gè)域年可以為空。每個(gè)域都有自己允許的值和一些特殊字符構(gòu)成。使用這些特殊字符可以使我們定義的表達(dá)式更加靈活。下面是對(duì)這些特殊字符的介紹逗號(hào),指定一個(gè)值列表例如使用在月域上1,4,5,7表示1月、4月、5月和7月橫杠-指定一個(gè)范圍例如在時(shí)域上3-6表示3點(diǎn)到6點(diǎn)即3點(diǎn)、4點(diǎn)、5點(diǎn)、6點(diǎn)星號(hào)*表示這個(gè)域上包含所有合法的值。例如在月份域上使用星號(hào)意味著每個(gè)月都會(huì)觸發(fā)斜線/表示遞增例如使用在秒域上0/15表示每15秒問(wèn)號(hào)?只能用在日和周域上但是不能在這兩個(gè)域上同時(shí)使用。表示不指定井號(hào)#只能使用在周域上用于指定月份中的第幾周的哪一天例如6#3意思是某月的第三個(gè)周五 (6星期五3意味著月份中的第三周)L某域上允許的最后一個(gè)值。只能使用在日和周域上。當(dāng)用在日域上表示的是在月域上指定的月份的最后一天。用于周域上時(shí)表示周的最后一天就是星期六WW 字符代表著工作日 (星期一到星期五)只能用在日域上它用來(lái)指定離指定日的最近的一個(gè)工作日C允許在日期域和星期域出現(xiàn)。這個(gè)字符依靠一個(gè)指定的“日歷”。也就是說(shuō)這個(gè)表達(dá)式的值依賴于相關(guān)的“日歷”的計(jì)算結(jié)果如果沒(méi)有“日歷”關(guān)聯(lián)則等價(jià)于所有包含的“日歷”。如日期域是“5C”表示關(guān)聯(lián)“日歷”中第一天或者這個(gè)月開(kāi)始的第一天的后5天。星期域是“1C”表示關(guān)聯(lián)“日歷”中第一天或者星期的第一天的后1天也就是周日的后一天周一。4.4 cron表達(dá)式在線生成器前面介紹了cron表達(dá)式但是自己編寫表達(dá)式還是有一些困難的我們可以借助一些cron表達(dá)式在線生成器來(lái)根據(jù)我們的需求生成表達(dá)式即可。http://cron.qqe2.com/5. 定時(shí)清理垃圾圖片前面我們已經(jīng)完成了體檢套餐的管理在新增套餐時(shí)套餐的基本信息和圖片是分兩次提交到后臺(tái)進(jìn)行操作的。也就是用戶首先將圖片上傳到七牛云服務(wù)器然后再提交新增窗口中錄入的其他信息。如果用戶只是上傳了圖片而沒(méi)有提交錄入的其他信息此時(shí)的圖片就變?yōu)榱死鴪D片因?yàn)樵跀?shù)據(jù)庫(kù)中并沒(méi)有記錄它的存在。此時(shí)我們要如何處理這些垃圾圖片呢解決方案就是通過(guò)定時(shí)任務(wù)組件定時(shí)清理這些垃圾圖片。為了能夠區(qū)分出來(lái)哪些圖片是垃圾圖片我們?cè)谖募蟼鞒晒髮D片保存到了一個(gè)redis集合中當(dāng)套餐數(shù)據(jù)插入到數(shù)據(jù)庫(kù)后我們又將圖片名稱保存到了另一個(gè)redis集合中通過(guò)計(jì)算這兩個(gè)集合的差值就可以獲得所有垃圾圖片的名稱。本章節(jié)我們就會(huì)基于Quartz定時(shí)任務(wù)通過(guò)計(jì)算redis兩個(gè)集合的差值找出所有的垃圾圖片就可以將垃圾圖片清理掉。操作步驟1創(chuàng)建springBoot工程health_jobs打包方式為war導(dǎo)入Quartz等相關(guān)坐標(biāo)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啟動(dòng)類添加注解EnableScheduling //開(kāi)啟基于注解的定時(shí)任務(wù)3配置application.ymlserver: port: 88 #redis配置 spring: redis: host: 127.0.0.14自定義Job實(shí)現(xiàn)定時(shí)清理垃圾圖片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實(shí)現(xiàn)定時(shí)清理垃圾圖片 */ Component public class ClearImgJob { Autowired StringRedisTemplate redisTemplate; //操作k-v都是字符串的 Scheduled(cron 0/10 * * * * ?) public void clearImg(){ //根據(jù)Redis中保存的兩個(gè)set集合進(jìn)行差值計(jì)算獲得垃圾圖片名稱集合 //sdiff方法是計(jì)算兩個(gè)集合的差值 SetString set redisTemplate.opsForSet().difference(RedisConstant.SETMEAL_PIC_RESOURCES, RedisConstant.SETMEAL_PIC_DB_RESOURCES); if(set ! null){ for (String picName : set) { //刪除七牛云服務(wù)器上的圖片 QiniuUtils.deleteFileFromQiniu(picName); //從Redis集合中刪除圖片名稱 redisTemplate.opsForSet(). remove(RedisConstant.SETMEAL_PIC_RESOURCES,picName); System.out.println(自定義任務(wù)執(zhí)行清理垃圾圖片picName); } } } }