您好,登錄后才能下訂單哦!
Spring項(xiàng)目中QuartZ定時(shí)服務(wù)的原理是什么?相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
什么是Quartz?
Quartz是一個(gè)強(qiáng)大的企業(yè)級(jí)任務(wù)調(diào)度框架。它允許開發(fā)人員靈活地定義觸發(fā)器的調(diào)度時(shí)間表,并可對(duì)觸發(fā)器和任務(wù)進(jìn)行關(guān)聯(lián)映射。此外,Quartz提供了調(diào)度運(yùn)行環(huán)境的持久化機(jī)制,可以保存并會(huì)發(fā)調(diào)度現(xiàn)場(chǎng),即使系統(tǒng)因故障關(guān)閉,任務(wù)調(diào)度現(xiàn)場(chǎng)數(shù)據(jù)并不會(huì)丟失。Spring中繼承并簡(jiǎn)化了Quartz。
如何使用Quartz?
對(duì)于Quartz,我們使用的時(shí)候主要是注重兩個(gè)方面,一個(gè)是定時(shí)任務(wù)的業(yè)務(wù),另一個(gè)就是Cron表達(dá)式。
1>Quartz存在兩種方式來定義定時(shí)執(zhí)行任務(wù),一種是使用QuartJobBean和JobDetailBean;另一種是使用MethodInvokingJobDetailFactoryBean。
2>Cron表達(dá)式包括下面7個(gè)字段并區(qū)別順序:秒0-59,分0-59,小時(shí)0-23,月內(nèi)日期1-31,月1-12或者JAN-DEC,周內(nèi)日期1-7或者SUN-SAT,年(可選字段)留空或者1970-2099并且通過特殊字符表示特殊意義,具體為下:
例子:
"0 0 08 * * ?" 每天上午8點(diǎn)觸發(fā)
"0 15 10 ? * *" 每天上午10:15觸發(fā)
"0 15 10 * * ?" 每天上午10:15觸發(fā)
"0 15 10 ? * 6L 2009-2019" 2009年至2019年的每月的最后一個(gè)星期五上午10:15觸發(fā)
"0 15 10 ? * 6#3" 每月的第三個(gè)星期五上午10:15觸發(fā)
【示例】
我們使用Spring定時(shí)服務(wù)Quartz來實(shí)現(xiàn)一個(gè)每5秒打印一次當(dāng)前時(shí)間的小例子。
1:定義接口IPrintInfoService類
package demoinfo.spring.quartz; public interface IPrintInfoService { public void print(); }
2:實(shí)現(xiàn)接口類PrintInfoServiceImpl
package demoinfo.spring.quartz; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import demoinfo.spring.quartz.IPrintInfoService; public class PrintInfoServiceImpl implements IPrintInfoService{ public void print() { Calendar now = Calendar.getInstance(); System.out.println("現(xiàn)在是北京時(shí)間:" + this.format(now.getTime())); } public String format(Date date){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return sdf.format(date); } }
3:基于QuartzJobBean的實(shí)現(xiàn)類PrintInfoJob
package demoinfo.spring.quartz; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.quartz.QuartzJobBean; import demoinfo.spring.quartz.IPrintInfoService; public class PrintInfoJob extends QuartzJobBean{ private IPrintInfoService prinfInfoService = null; public IPrintInfoService getPrinfInfoService() { return prinfInfoService; } public void setPrinfInfoService(IPrintInfoService prinfInfoService) { this.prinfInfoService = prinfInfoService; } @Override protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException { this.prinfInfoService.print(); } }
4:Spring配置文件applicationContext.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" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <bean id="printInfoService" class="demoinfo.spring.quartz.PrintInfoServiceImpl" /> <!-- 配置一個(gè)Job --> <bean id="printInfoJob" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" value="demoinfo.spring.quartz.PrintInfoJob" /> <property name="jobDataAsMap"> <map> <entry key="prinfInfoService" value-ref="printInfoService"></entry> </map> </property> </bean> <!-- 簡(jiǎn)單的觸發(fā)器 --> <bean id="simplePrintInfoTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <property name="jobDetail"> <ref bean="printInfoJob" /> </property> <property name="startDelay"> <value>6000</value> </property> <property name="repeatInterval"> <value>6000</value> </property> </bean> <!--復(fù)雜的觸發(fā)器 --> <bean id="complexPrintInfoTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <ref bean="printInfoJob" /> </property> <property name="cronExpression"> <value>00,05,10,15,20,25,30,35,40,45,50,55 * * * * ?</value> </property> </bean> <!-- spring觸發(fā)工廠 --> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="complexPrintInfoTrigger" /> </list> </property> </bean> </beans>
5:測(cè)試用例類SpringQuartzDemo
package demoinfo.spring.quartz; import org.springframework.context.support.ClassPathXmlApplicationContext; public class SpringQuartzDemo { public static void main(String[] args) { System.out.println("測(cè)試開始......"); new ClassPathXmlApplicationContext( "classpath:demoinfo/spring/quartz/applicationContext.xml"); System.out.println("測(cè)試結(jié)束......"); } }
運(yùn)行測(cè)試用例,可以看到控制臺(tái)每過5秒鐘就打印一次時(shí)間信息。
看完上述內(nèi)容,你們掌握Spring項(xiàng)目中QuartZ定時(shí)服務(wù)的原理是什么的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。