ssh中使用spring的集成quartz 編寫定時任務


之前沒有使用框架開發時對於開發定時任務都是 使用java的原聲timer類,重寫線程的run方法跑要執行的任務。剛剛換的新公司,項目使用ssh2,目前該項目中的定時任務的使用spirng集成的quartz工具,非常方便。好了,廢話不多說,說一下開發過程。

首先,需要建一個資源配置xml文件,一般以quartz結尾。如我項目中的該文件名為:applicationContext-bms-sendxml-quartz.xml,別忘了在applicationContext.xml文件中導入該文件。applicationContext-bms-sendxml-quartz.xml文件配置如下

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時, 

CronTriggerBean:  CronTrigger  支持比 SimpleTrigger 更具體的調度,而且也不是很復雜。基於 cron 表達式,CronTrigger 支持類似日歷的重復間隔,而不是單一的時間間隔。具體配置如下

采用org.springframework.scheduling.quartz.SimpleTriggerBean:

<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參數就是配置任務時間參數,具體見我關於兩個觸發器的其他博文

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表示不並發。好了,看看這個任務實現類和實現方法:

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,如有異議可留言交流


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM