框架-quartz
OpenSymphony 的Quartz提供了一個比較完美的任務調度解決方案。
二:quartz spring配置詳解
- 為什么不適用java.util.Timer結合java.util.TimerTask
2.其次性能的原因,使用jdk自帶的Timer不具備多線程,而quartz采用線程池,性能上比timer高出很多。
- 詳解quartz在spring里面的配置
主要講解通過spring提供的代理類MethodInvokingJobDetailFactoryBean
1.業(yè)務邏輯類:業(yè)務邏輯是獨立的,本身就與quartz解耦的,并沒有深入進去,這對業(yè)務來講是很好的一個方式。
public class TestJobTask{
/**
*業(yè)務邏輯處理
*/
public void service(){
/**業(yè)務邏輯*/



}
}
2.增加一個線程池
<!-- 線程執(zhí)行器配置,用于任務注冊 -->
<property name="corePoolSize" value="10" />
<property name="maxPoolSize" value="100" />
<property name="queueCapacity" value="500" />
</bean>
3.定義業(yè)務邏輯類
<!-- 業(yè)務對象 -->
4.增加quartz調用業(yè)務邏輯
<!-- 調度業(yè)務 -->
<property name="targetObject" ref="testJobTask" />
<property name="targetMethod" value="service" />
</bean>
5.增加調用的觸發(fā)器,觸發(fā)的時間,有兩種方式:
第一種觸發(fā)時間,采用類似linux的cron,配置時間的表示發(fā)出豐富
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="cronExpression" value="10 0/1 * * * ?" />
</bean>
第二種,采用比較簡話的方式,申明延遲時間和間隔時間
<bean id="taskTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="startDelay" value="10000" />
<property name="repeatInterval" value="60000" />
</bean>
6.開始調用
<!-- 設置調度 -->
<property name="triggers">
<list>
<ref bean="cronTrigger" />
</list>
</property>
<property name="taskExecutor" ref="executor" />
</bean>
7.結束:啟動容器即可,已經將spring和quartz結合完畢。
Cron常用的表達式
"0 0 12 * * ?" 每天中午12點觸發(fā)
"0 15 10 * * ?" 每天上午10:15觸發(fā)
"0 15 10 * * ? *" 每天上午10:15觸發(fā)
"0 15 10 * * ? 2005" 2005年的每天上午10:15觸發(fā)
"0 * 14 * * ?" 在每天下午2點到下午2:59期間的每1分鐘觸發(fā)
"0 0/5 14 * * ?" 在每天下午2點到下午2:55期間的每5分鐘觸發(fā)
"0 0/5 14,18 * * ?" 在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發(fā)
"0 0-5 14 * * ?" 在每天下午2點到下午2:05期間的每1分鐘觸發(fā)
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午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" 每月的最后一個星期五上午10:15觸發(fā)
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一個星期五上午10:15觸發(fā)
"0 15 10 ? * 6#3" 每月的第三個星期五上午10:15觸發(fā)
三:quartz原理
根據上面spring的配置,我們就比較清楚quartz的內部情況,下面我們主要詳解配置涉及到的每個點
1.我們先從最后一個步驟看起,SchedulerFactoryBean ,scheduler的工廠實現,里面可以生產出對應的多個jobDetail和trigger,每個jobDetail對應trigger代表一個任務
Quartz的SchedulerFactory是標準的工廠類,不太適合在Spring環(huán)境下使用。此外,為了保證Scheduler能夠感知 Spring容器的生命周期,完成自動啟動和關閉的操作,必須讓Scheduler和Spring容器的生命周期相關聯(lián)。以便在Spring容器啟動后, Scheduler自動開始工作,而在Spring容器關閉前,自動關閉Scheduler。為此,Spring提供 SchedulerFactoryBean,這個FactoryBean大致?lián)碛幸韵碌墓δ埽?nbsp;
3.trigger:調度的時間計劃,什么時候,每隔多少時間可執(zhí)行等時間計劃
4.ThreadPoolTaskExecutor,線程池,用來并行執(zhí)行每個對應的job,提高效率,這也是上面提到不推薦使用jdk自身timer的一個很重要的原因