Quartz任務(wù)調(diào)度器
與spring的整合
<?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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
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
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
">
<!-- 定義一個(gè)任務(wù)類 -->
<bean id="mailJobBean" class="cn.itcast.erp.job.MailJob">
<property name="contractService" ref="contractService"></property>
</bean>
<!-- 任務(wù)類描述 -->
<bean id="mailJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="mailJobBean"></property>
<property name="targetMethod" value="send"></property>
</bean>
<!-- 觸發(fā)器 -->
<bean id="mailTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="mailJobDetail"></property>
<!-- 表達(dá)式订讼,每天的8:30:00 執(zhí)行 -->
<property name="cronExpression" value="0 30 8 * * ?"></property>
</bean>
<!-- 總管理容器 -->
<bean id="startQuartz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
<property name="triggers">
<list>
<ref bean="mailTrigger"/>
</list>
</property>
</bean>
</beans>
核心概念
1.scheduler是一個(gè)計(jì)劃調(diào)度器容器蝌借,容器里面可以盛放眾多的JobDetail和trigger,當(dāng)容器啟動(dòng)后毅贮,里面的每個(gè)JobDetail都會(huì)根據(jù)trigger按部就班自動(dòng)去執(zhí)行
2.JobDetail是一個(gè)可執(zhí)行的工作惜犀,它本身可能是有狀態(tài)的
3.Trigger代表一個(gè)調(diào)度參數(shù)的配置,什么時(shí)候去調(diào)
4.當(dāng)JobDetail和Trigger在scheduler容器上注冊(cè)后马昨,形成了裝配好的作業(yè)(JobDetail和Trigger所組成的一對(duì)兒)竞帽,就可以伴隨容器啟動(dòng)而調(diào)度執(zhí)行了
5.scheduler是個(gè)容器,容器中有一個(gè)線程池鸿捧,用來并行調(diào)度執(zhí)行每個(gè)作業(yè)屹篓,這樣可以提高容器效率。
Quartz Cron 表達(dá)式
* * * ? * *
表達(dá)會(huì)每秒鐘(每分種的匙奴、每小時(shí)的堆巧、每天的)激發(fā)一個(gè)部署的 job
星號(hào)
*
使用星號(hào)(*) 指示著你想在這個(gè)域上包含所有合法的值。例如饥脑,在月份域上使用星號(hào)意味著每個(gè)月都會(huì)觸發(fā)這個(gè) trigger。
表達(dá)式樣例: 0 * 17 * * ?
意義:每天從下午5點(diǎn)到下午5:59中的每分鐘激發(fā)一次 trigger懦冰。它停在下午 5:59 是因?yàn)橹?17 在小時(shí)域上灶轰,在下午 6 點(diǎn)時(shí),小時(shí)變?yōu)?18 了刷钢,也就不再理會(huì)這個(gè) trigger笋颤,直到下一天的下午5點(diǎn)。
問好
? 號(hào)只能用在日和周域上,但是不能在這兩個(gè)域上同時(shí)使用伴澄。你可以認(rèn)為 ? 字符是 "我并不關(guān)心在該域上是什么值赋除。" 這不同于星號(hào),星號(hào)是指示著該域上的每一個(gè)值非凌。? 是說不為該域指定值举农。
只要記住,假如你為這兩域的其中一個(gè)指定了值敞嗡,那就必須在另一個(gè)字值上放一個(gè) ?
0 10,44 14 ? 3 WEB
意義:在三月中的每個(gè)星期三的下午 2:10 和 下午 2:44 被觸發(fā)
逗號(hào)
逗號(hào) (,) 是用來在給某個(gè)域上指定一個(gè)值列表的颁糟。例如,使用值 0,15,30,45 在秒域上意味著每15秒觸發(fā)一個(gè) trigger喉悴。
0 0,15,30,45 * * * ?
意義:每刻鐘觸發(fā)一次 trigger棱貌。
斜杠
斜杠 (/) 是用于時(shí)間表的遞增的。我們剛剛用了逗號(hào)來表示每15分鐘的遞增箕肃,但是我們也能寫成這樣 0/15
0/15 0/30 * * * ?
在整點(diǎn)和半點(diǎn)時(shí)每15秒觸發(fā) trigger
中劃線
中劃線 (-) 用于指定一個(gè)范圍婚脱。例如,在小時(shí)域上的 3-8 意味著 "3,4,5,6,7 和 8 點(diǎn)勺像。" 域的值不允許回卷障贸,所以像 50-10 這樣的值是不允許的
0 45 3-8 ? * *
在上午的3點(diǎn)至上午的8點(diǎn)的45分時(shí)觸發(fā) trigger
L 字母
L 說明了某域上允許的最后一個(gè)值。它僅被日和周域支持咏删。當(dāng)用在日域上惹想,表示的是在月域上指定的月份的最后一天
表達(dá)式 0 0 8 L * ? 意義是在每個(gè)月最后一天的上午 8:00 觸發(fā) trigger。在月域上的 * 說明是 "每個(gè)月"
當(dāng) L 字母用于周域上督函,指示著周的最后一天嘀粱,就是星期六 (或者數(shù)字7)。所以如果你需要在每個(gè)月的最后一個(gè)星期六下午的 11:59 觸發(fā) trigger辰狡,你可以用這樣的表達(dá)式 0 59 23 ? * L
當(dāng)使用于周域上锋叨,你可以用一個(gè)數(shù)字與 L 連起來表示月份的最后一個(gè)星期 X。例如宛篇,表達(dá)式 0 0 12 ? * 2L 說的是在每個(gè)月的最后一個(gè)星期一觸發(fā) trigger
井號(hào)
# 字符僅能用于周域中娃磺。它用于指定月份中的第幾周的哪一天。
例如叫倍,如果你指定周域的值為 6#3偷卧,它意思是某月的第三個(gè)周五 (6=星期五,#3意味著月份中的第三周)吆倦。
例如听诸,2#1 意思是某月的第一個(gè)星期一 (2=星期一,#1意味著月份中的第一周)蚕泽。注意晌梨,假如你指定 #5,然而月份中沒有第 5 周,那么該月不會(huì)觸發(fā)仔蝌。
示例
"0 0 12 * *?" 每天中午12點(diǎn)觸發(fā)
"0 15 10 ? * *" 每天上午10:15觸發(fā)
"0 15 10 * *?" 每天上午10:15觸發(fā)
"0 15 10 * * ?*" 每天上午10:15觸發(fā)
"0 15 10 * * ?2005" 2005年的每天上午10:15觸發(fā)
"0 * 14 * *?" 在每天下午2點(diǎn)到下午2:59期間的每1分鐘觸發(fā)
"0 0/5 14 * *?" 在每天下午2點(diǎn)到下午2:55期間的每5分鐘觸發(fā)
"0 0/5 14,18 ** ?" 在每天下午2點(diǎn)到2:55期間和下午6點(diǎn)到6:55期間的每5分鐘觸發(fā)
"0 0-5 14 * *?" 在每天下午2點(diǎn)到下午2:05期間的每1分鐘觸發(fā)
"0 10,44 14 ? 3WED" 每年三月的星期三的下午2:10和2:44觸發(fā)
"0 15 10 ? *MON-FRI" 周一至周五的上午10:15觸發(fā)
"0 15 10 15 *?" 每月15日上午10:15觸發(fā)
"0 15 10 L *?" 每月最后一日的上午10:15觸發(fā)
"0 15 10 ? *6L" 每月的最后一個(gè)星期五上午10:15觸發(fā)
"0 15 10 ? * 6L2002-2005" 2002年至2005年的每月的最后一個(gè)星期五上午10:15觸發(fā)
"0 15 10 ? *6#3" 每月的第三個(gè)星期五上午10:15觸發(fā)