原帖地址:http://nesuk.iteye.com/blog/1582557
關于SPRing集成Quartz的concurrent屬性
以前經常在任務調度程序中使用Spring集成的Quartz,這種方式可以用簡單的聲明式配置即可實現定時任務,并結合了Spring自身的Bean的管理功能,非常方便。配置樣本如下:
<!-- 要調用的工作類 --> <bean id="webStart" class="com.quartz.webStart"></bean> <!-- 定義調用對象和調用對象的方法 --> <bean id="jobtask1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!-- 調用的類 --> <property name="targetObject"> <ref bean="webStart"/> </property> <!-- 調用類中的方法 --> <property name="targetMethod"> <value>start1</value> </property> <property name="concurrent"> <value>false</value> </property> </bean> <!-- 定義觸發時間 --> <bean id="doTime1" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail"> <ref bean="jobtask1"/> </property> <!-- cron表達式 --><!-- 秒 分 時 日 月 周 年 0 0/10 * * * ?--> <property name="cronExpression" value="0 0/2 * * * ?"> </property> </bean> <!-- 總管理類 如果將lazy-init='false'那么容器啟動就會執行調度程序 --> <bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="doTime1"/> </list> </property> </bean>其中concurrent屬性標識的解釋為:對于相同的JobDetail,當指定多個Trigger時, 很可能第一個job完成之前,第二個job就開始了。指定concurrent設為false,多個job不會并發運行,第二個job將不會在第一個job完成之前開始。 那么此處的第二個job到底是被推遲執行了,還是被取消了呢? 今天帶著這個疑問做了一個小實驗,具體做法如下:將任務的Trigger設置為每10秒鐘執行一次,然后在執行的任務體內讓Thread暫停15秒鐘,這樣不同的job之間肯定會有時間上的重疊。當啟動程序之后,發現前一個job執行結束的時刻的秒數為15,而且第二個本來在10s就執行的job馬上就啟動了。 由此可見,concurrent屬性實際是將job推遲執行了。
新聞熱點
疑難解答