以前沒有使用框架開發時對於開發定時任務都是 使用java的原聲timer類,重寫線程的run方法跑要執行的任務。剛剛換的新公司,項目使用ssh2,目前該項目中的定時任務的使用spirng集成的quartz工具,很是方便。好了,廢話很少說,說一下開發過程。java
首先,須要建一個資源配置xml文件,通常以quartz結尾。如我項目中的該文件名爲:applicationContext-bms-sendxml-quartz.xml,別忘了在applicationContext.xml文件中導入該文件。applicationContext-bms-sendxml-quartz.xml文件配置以下spring
1.配置調度工廠,這個bean是生成spring集成quartz的工具類org.springframework.scheduling.quartz.SchedulerFactoryBean的對象,用於管理調度對象。併發
<!-- 配置調度工廠 --> <bean id="startQuertz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="ContentInjectResponseTrigger" /> </list> </property> </bean>
2.配置調度任務。這個調度任務有兩個不一樣的實現類,分別是org.springframework.scheduling.quartz.SimpleTriggerBean和org.springframework.scheduling.quartz.CronTriggerBean,區別爲:
SimpleTrigger:當須要在規定的時間執行一次或在規定的時間段以必定的時間間隔重複觸發執行Job時, app
CronTriggerBean: CronTrigger 支持比 SimpleTrigger 更具體的調度,並且也不是很複雜。基於 cron 表達式,CronTrigger 支持相似日曆的重複間隔,而不是單一的時間間隔。具體配置以下框架
採用org.springframework.scheduling.quartz.SimpleTriggerBean:ssh
<bean id="CheckAssetStatusTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <property name="jobDetail" ref="jobAssetStatusCheck" /> <property name="startDelay" value="60000" /> <!-- 調度工廠實例化後,通過0秒開始執行調度 --> <property name="repeatInterval" value="600000" /> <!-- 每5分鐘調度一次 --> </bean>
採用org.springframework.scheduling.quartz.CronTriggerBean:工具
<bean id="ContentInjectResponseTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="cronExpression"> <value>${QueryContentResponseCronExpression}</value> </property> <property name="jobDetail" ref="autoQueryContentResponseJob"/> </bean>
如上代碼中的cronExpression參數就是配置任務時間參數,具體見我關於兩個觸發器的其餘博文spa
3.配置具體的調度事項,即上面代碼的autoQueryContentResponseJob類線程
<bean id="autoQueryContentResponseJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject"> <bean class="com.avit.mmsp.common.message.CallBackInjectResultJob"/> </property> <property name="targetMethod" value="execute"/> <property name="concurrent" value="false"/> </bean>
targetObject爲目標類,targetMethod即爲任務執行方法。concurrent參數表示是否併發調度,false表示不併發。好了,看看這個任務實現類和實現方法:code
package com.avit.mmsp.common.message; import javax.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import com.avit.mmsp.common.datasource.CustomerContextHolder; import com.avit.mmsp.common.message.service.ContentInjectResponseService; public class CallBackInjectResultJob { private static Logger log = LoggerFactory.getLogger(SendMessageJob.class); @Inject private ContentInjectResponseService contentInjectResponseService; public void execute() { CustomerContextHolder.setCustomerType(CustomerContextHolder.CMS_DATA_SOURCE); try { log.info("查詢內容注入結果開始"); contentInjectResponseService.injectResponse(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
具體的實現就不貼出來了。over,若有異議可留言交流