javascript
Spring整合定时任务组件Quartz的简单使用
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/
簡(jiǎn)單使用(使用步奏與解釋在代碼注釋中)
搭建maven工程
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.fs</groupId><artifactId>QuartzDemo</artifactId><version>1.0-SNAPSHOT</version><dependencies> <!-- spring--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.9.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>5.0.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.1.9.RELEASE</version></dependency> <!-- quartz 定時(shí)器--><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.2.1</version></dependency><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz-jobs</artifactId><version>2.2.1</version></dependency></dependencies> </project>applicationContext-jobs.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- 把自定義的定時(shí)任務(wù)類(這個(gè)類是個(gè)普通類,里面需要自己編寫定時(shí)執(zhí)行的方法)springIOC管理--><bean id="quartzHelloWorld" class="com.fs.regularwork.QuartzHelloWorld"></bean> <!-- 設(shè)置第二個(gè)定時(shí)類--><bean id="quartzHelloWorld02" class="com.fs.regularwork.QuartzHelloWorld02"></bean><!-- 將方法調(diào)用作業(yè)詳細(xì)信息工廠Bean交給ioc管理--><bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!-- 注入自定義的定時(shí)任務(wù)類的對(duì)象--><property name="targetObject" ref="quartzHelloWorld"/> <!-- 注入自定義調(diào)用對(duì)象的具體執(zhí)行的方法--><property name="targetMethod" value="quartzTest"/></bean><!-- 將方法調(diào)用作業(yè)詳細(xì)信息工廠Bean交給ioc管理--><bean id="jobDetail02" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><!-- 注入自定義的定時(shí)任務(wù)類的對(duì)象--><property name="targetObject" ref="quartzHelloWorld02"/><!-- 注入自定義調(diào)用對(duì)象的具體執(zhí)行的方法--><property name="targetMethod" value="quartzTest02"/></bean><!-- 注冊(cè)一個(gè)觸發(fā)器,指定任務(wù)觸發(fā)時(shí)間,觸發(fā)上面指定的方法--><bean id="myTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <!-- 注入jobDetail,通過(guò)反射來(lái)調(diào)用我們上面自定義的方法--><property name="jobDetail" ref="jobDetail"/> <!-- 指定觸發(fā)事件,基于Cron表達(dá)式--><property name="cronExpression"> <!-- 從0秒開(kāi)始,每10秒執(zhí)行一次,測(cè)試功能使用--><value>0/10 * * * * ? </value> <!-- 從每天的3點(diǎn)開(kāi)始執(zhí)行一次--> <!-- <value>0 0 3 * * ? </value>--> <!-- 從0小時(shí)開(kāi)始,30分鐘執(zhí)行一次 --> <!-- <value>0 0/30 * * * ?</value>--></property></bean><!-- 注冊(cè)一個(gè)觸發(fā)器,指定任務(wù)觸發(fā)時(shí)間,觸發(fā)上面指定的方法--><bean id="myTrigger02" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"><!-- 注入jobDetail,通過(guò)反射來(lái)調(diào)用我們上面自定義的方法--><property name="jobDetail" ref="jobDetail02"/><property name="cronExpression"><value>0/10 * * * * ? </value></property></bean><!-- 統(tǒng)一注冊(cè)一個(gè)調(diào)度工廠,通過(guò)這個(gè)調(diào)用工廠調(diào)度觸發(fā)器任務(wù) --><bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <!-- 可以注入多個(gè)觸發(fā)器--><property name="triggers"><list> <!-- 注入上面觸發(fā)器,可以注入多個(gè),我由于上面配置了2個(gè),所以我注入2個(gè)測(cè)試能否10秒執(zhí)行方法--><ref bean="myTrigger"/><ref bean="myTrigger02"/></list></property></bean> </beans>java config方式(偽代碼)
package com.fs.config;import com.fs.controller.JorumServerRegister; import org.quartz.JobDetail; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.quartz.CronTriggerFactoryBean; import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean; import org.springframework.scheduling.quartz.SchedulerFactoryBean;@Configuration public class QuartzConfig {//注入統(tǒng)一任務(wù)類@Autowiredprivate 任務(wù)類 jorumServerRegister;@Bean("heartbeat")public MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean(){MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean = new MethodInvokingJobDetailFactoryBean();//注入自定義的定時(shí)任務(wù)類的對(duì)象methodInvokingJobDetailFactoryBean.setTargetObject(jorumServerRegister);//注入自定義調(diào)用對(duì)象的具體執(zhí)行的方法methodInvokingJobDetailFactoryBean.setTargetMethod("heartbeat");return methodInvokingJobDetailFactoryBean;}//觸發(fā)器@Beanpublic CronTriggerFactoryBean cronTriggerFactoryBean(@Autowired @Qualifier("heartbeat") MethodInvokingJobDetailFactoryBean heartbeat){CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean();// 注入jobDetail,通過(guò)反射來(lái)調(diào)用我們上面自定義的方法JobDetail object = heartbeat.getObject();cronTriggerFactoryBean.setJobDetail(object);//10秒執(zhí)行一次心跳方法cronTriggerFactoryBean.setCronExpression("0/10 * * * * ? ");return cronTriggerFactoryBean;}//注冊(cè)一個(gè)統(tǒng)一調(diào)度工廠@Beanpublic SchedulerFactoryBean schedulerFactoryBean(@Autowired CronTriggerFactoryBean cronTriggerFactoryBean){SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();//注入上面觸發(fā)器schedulerFactoryBean.setTriggers(cronTriggerFactoryBean.getObject());return schedulerFactoryBean;} }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í),表示周的最后一天,就是星期六
W:W 字符代表著工作日 (星期一到星期五),只能用在日域上,它用來(lái)指定離指定日的最近的一個(gè)工作
日
cron表達(dá)式在線生成網(wǎng)站
前面介紹了cron表達(dá)式,但是自己編寫表達(dá)式還是有一些困難的,我們可以借助一些cron表達(dá)式在線生
成器來(lái)根據(jù)我們的需求生成表達(dá)式即可。
cron表達(dá)式在線生成
QuartzHelloWorld
package com.fs.regularwork;import java.text.SimpleDateFormat; import java.util.Date; /* 自定義的普通類,讓Quartz 通過(guò)反射來(lái)定時(shí)執(zhí)行這個(gè)方法*/ public class QuartzHelloWorld {//編寫定時(shí)執(zhí)行的方法,注意要是public的public void quartzTest(){System.out.println("02:HelloWorld_Quartz"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date().getTime()));} }QuartzHelloWorld02
package com.fs.regularwork;import java.text.SimpleDateFormat; import java.util.Date;/* 自定義的普通類,讓Quartz 通過(guò)反射來(lái)定時(shí)執(zhí)行這個(gè)方法*/ public class QuartzHelloWorld02 {//編寫定時(shí)執(zhí)行的方法,注意要是public的public void quartzTest02(){System.out.println("01:HelloWorld_Quartz"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date().getTime()));} }TestQuartz測(cè)試類
package com.fs.regularwork;import org.springframework.context.support.ClassPathXmlApplicationContext; /* 測(cè)試Quartz*/ public class TestQuartz {public static void main(String[] args) {//只有創(chuàng)建了spring的容器,定時(shí)器就會(huì)去反射通過(guò)我們xml配置的cron表達(dá)式指定的時(shí)間去調(diào)用我們配置的方法new ClassPathXmlApplicationContext("classpath:applicationContext-jobs.xml");} }運(yùn)行結(jié)果
總結(jié)
以上是生活随笔為你收集整理的Spring整合定时任务组件Quartz的简单使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Zookeeper常用命令操作,java
- 下一篇: SpringSecurity的简单使用使