您好,登錄后才能下訂單哦!
Spring項目中QuartZ定時服務的原理是什么?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
什么是Quartz?
Quartz是一個強大的企業級任務調度框架。它允許開發人員靈活地定義觸發器的調度時間表,并可對觸發器和任務進行關聯映射。此外,Quartz提供了調度運行環境的持久化機制,可以保存并會發調度現場,即使系統因故障關閉,任務調度現場數據并不會丟失。Spring中繼承并簡化了Quartz。
如何使用Quartz?
對于Quartz,我們使用的時候主要是注重兩個方面,一個是定時任務的業務,另一個就是Cron表達式。
1>Quartz存在兩種方式來定義定時執行任務,一種是使用QuartJobBean和JobDetailBean;另一種是使用MethodInvokingJobDetailFactoryBean。
2>Cron表達式包括下面7個字段并區別順序:秒0-59,分0-59,小時0-23,月內日期1-31,月1-12或者JAN-DEC,周內日期1-7或者SUN-SAT,年(可選字段)留空或者1970-2099并且通過特殊字符表示特殊意義,具體為下:
例子:
"0 0 08 * * ?" 每天上午8點觸發
"0 15 10 ? * *" 每天上午10:15觸發
"0 15 10 * * ?" 每天上午10:15觸發
"0 15 10 ? * 6L 2009-2019" 2009年至2019年的每月的最后一個星期五上午10:15觸發
"0 15 10 ? * 6#3" 每月的第三個星期五上午10:15觸發
【示例】
我們使用Spring定時服務Quartz來實現一個每5秒打印一次當前時間的小例子。
1:定義接口IPrintInfoService類
package demoinfo.spring.quartz; public interface IPrintInfoService { public void print(); }
2:實現接口類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("現在是北京時間:" + 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的實現類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" /> <!-- 配置一個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> <!-- 簡單的觸發器 --> <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> <!--復雜的觸發器 --> <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觸發工廠 --> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="complexPrintInfoTrigger" /> </list> </property> </bean> </beans>
5:測試用例類SpringQuartzDemo
package demoinfo.spring.quartz; import org.springframework.context.support.ClassPathXmlApplicationContext; public class SpringQuartzDemo { public static void main(String[] args) { System.out.println("測試開始......"); new ClassPathXmlApplicationContext( "classpath:demoinfo/spring/quartz/applicationContext.xml"); System.out.println("測試結束......"); } }
運行測試用例,可以看到控制臺每過5秒鐘就打印一次時間信息。
看完上述內容,你們掌握Spring項目中QuartZ定時服務的原理是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。