Quartz - Spring和Quartz的整合

襲冷發表於2018-03-06

一、建立任務實體 實現任務的具體邏輯


    1、繼承式的實現
    package com.xl.task;
    
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
    import org.springframework.scheduling.quartz.QuartzJobBean;
    
    public class SimpleExtsJob extends QuartzJobBean {
        
        private String alias;  //由JobDetailBean的jobDataAsMap注入
        
        @Override
        protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
            
            System.out.println("Job start...");
    
        }
    
        public void setAlias(String alias) {
            this.alias = alias;
        }
    
    }
    2、非繼承的實現
    package com.xl.task;
    
    import org.springframework.stereotype.Component;


    @Component
    public class SimpleCommJob {

        public void doJob() throws Exception {

            System.out.println("Job start...");

        }
    }

二、配置作業細節 注入要被排程的任務


    1、繼承式的排程配置

    <bean name="simpleExtsJobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">
        <property name="jobClass" value="com.xl.task.SimpleExtsJob" />  <!-- 配置Job的類名 -->
        <property name="jobDataAsMap">  <!-- 為有屬性需要注入的Job配置值(quartz1.6和spring3.0可以自動為為繼承式Job屬性注入)  -->
            <map>
                <entry key="alias" value="simple" />
            </map>
        </property>  
    </bean>
    2、非繼承的排程配置
    <bean id="SimpleCommJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="simpleCommJob"/>  <!-- 注入Bean的Id -->
        <property name="targetMethod" value="doJob"/>  <!-- 任務被排程後執行的方法 -->
        <property name="concurrent" value="false"/>  <!-- 是否允許併發(在任務執行時間大於排程間隔時間時) -->
    </bean>

三、配置任務觸發器 繼承和非繼承的配置相同,定義任務觸發的時間與頻率,常用觸發器有SimpleTrigger和CronTrigger兩種


    1、SimpleTriggerBean觸發器,每隔多長時間執行一次的觸發器(上一次開始到下一次開始開始之間的間隔)

    <bean id="simpleCommSimpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
        <property name="jobDetail" ref="simpleCommJobDetail" />
        <property name="startDelay" value="60000" />
        <property name="repeatInterval" value="60000" />
    </bean>
    2、CronTriggerBean觸發器,每到什麼時間執行一次的觸發器(如每天幾點幾分開始執行)
    <bean id="simpleCommCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="simpleCommJobDetail"/>
        <property name="cronExpression" >
            <value>0 0 9 * * ?</value>
        </property>
    </bean>

四、配置任務計劃的排程工廠

    <bean id="configScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref local="simpleCommSimpleTrigger"/>  <!-- 配置任務觸發器  -->
                <!-- <ref local="simpleCommCronTrigger"/> -->
            </list>
        </property>
    </bean>

五、補充

    1、如果出現定時排程的任務執行一段時間後突然不執行了,可以嘗試增大執行緒池的最大執行緒數org.quartz.threadPool.threadCount,該引數預設值為10



相關文章