Spring整合Quartz調度器

Quartz是一個任務調度框架,由Java語言開發,能夠用來作一些定時發送,監聽事件等工做。
例如:讓一個程序天天晚上12點執行一次。或者每隔5秒執行一次。spring

jar: org.quartz-scheduler包下app

Quartz完成調度須要3步框架

JobDetail:告訴調度器要作什麼。
Trigger:告訴調度器何時作。
Scheduler:準備妥了就從這裏start

下面就是一個簡單的spring 整合quartz的實例。ide

簡單實現

先看JobDetail部分:寫一個類實現Job接口,重寫execute()方法,在該方法中寫要執行的邏輯,(告訴調度器要作什麼)網站

public class UpdateProductJob implements Job{

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        try {
            System.out.print("我來檢查啦")
        }catch (Exception e){
            System.out.println(e);
        }
    }
}

而後是配置xml文件。spa

<!--quartz-->
    <bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <property name="jobClass" value="com.config.quartz.UpdateProductJob"></property>
    </bean>
<!--執行時間表達方式一-->
    <!--<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">-->
        <!--<property name="jobDetail" ref="jobDetail"></property>-->
        <!--<property name="startDelay" value="10000"></property>&lt;!&ndash;延遲10s&ndash;&gt;-->
        <!--<property name="repeatInterval" value="5000"></property>-->
    <!--</bean>-->
<!--執行時間表達方式二-->
    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="jobDetail" />
        <property name="cronExpression" value="0 59 23 ? * *" />
    </bean>

    <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="cronTrigger"/>
            </list>
        </property>
    </bean>

從上面能夠看到有兩個Trigger分別是simpleTrigger和cronTrigger,這是兩種表達執行時間的方式。code

simpleTrigger是比較簡單的方法,
<property name="repeatInterval" value="5000"></property>表示間隔5秒執行一次

而cronTrigger能夠表達一些比較複雜的時間格式
<property name="cronExpression" value="0 59 23 ? * *" />表示天天23點59分執行一次
具體的語法請搜索cron表達式,有些網站提供了自動生成cron表達式的功能
好比http://cron.qqe2.com/ or http://www.cronmaker.com/

解決spring注入問題

在spring框架中會常常用到IOC,那麼在上面的execute()方法中不避免的也會用到注入,可是對於新手來講會遇到注入的接口會是null。
解決這個問題有兩個方法:xml

1.使用ApplicationContex對象加載applicationContext.xml文件注入UserDaoI接口,可是這個方法很差的一點是每當用一個接口就要寫一個,比較麻煩。對象

ApplicationContext content = 
        new ClassPathXmlApplicationContext("classpath:META-INF/applicationContext.xml");
        userDaoI = content.getBean(UserDaoI.class);

2.第二個方法比較好,先寫一個類繼承AdaptableJobFactory 抽象方法,不須要任何改動繼承

@Service("jobFactory")
public class JobFactory extends AdaptableJobFactory {
    @Autowired
    private AutowireCapableBeanFactory capableBeanFactory;
    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        // 調用父類的方法
        Object jobInstance = super.createJobInstance(bundle);
        // 進行注入
        capableBeanFactory.autowireBean(jobInstance);
        return jobInstance;
    }
}

2.2而後將這個類添加到配置文件裏。

<bean id="jobFactory" class="com.config.quartz.JobFactory"></bean>
        <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="jobFactory" ref="jobFactory"></property>
        <property name="triggers">
            <list>
                <ref bean="cronTrigger"/>
            </list>
        </property>
    </bean>

最後完整的配置信息是:

<!--quartz-->
    <bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <property name="jobClass" value="com.config.quartz.UpdateProductJob"></property>
    </bean>

    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="jobDetail" />
        <property name="cronExpression" value="0 59 23 ? * *" />
    </bean>

    <bean id="jobFactory" class="com.config.quartz.JobFactory"></bean>
    
    <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="jobFactory" ref="jobFactory"></property>
        <property name="triggers">
            <list>
                <ref bean="cronTrigger"/>
            </list>
        </property>
    </bean>

JobDetail部分就能夠這樣寫了

@Service
public class UpdateProductJob implements Job{

    @Autowired
    ArticleService articleService;

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        try {
            articleService.updateArticleType();
        }catch (Exception e){
            System.out.println(e);
        }
    }
}

Quartz輪訓方式

Quartz輪訓任務,須要配置一個參數,這個參數來控制Job任務是否並行,這個參數是concurrent。默認是true,若是concurrent設爲true,到了指定的時間就如去執行,無論上一次有沒有執行完。

<bean id="transmitTask"   
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
    <property name="targetObject">  
        <ref bean="transTaskBusiness" />  
    </property>  
    <property name="targetMethod">  
        <value>execute</value>  
    </property>  
    <property name="concurrent">  
        <value>false</value>  
    </property>  
</bean>

任務監聽器

TriggerListeners and JobListeners 兩個接口分別是觸發器相關的監聽接口和做業相關監聽接口。
用來監聽監聽點以前,之中,以後須要處理的事情。
此外,也能夠直接繼承JobListenerSupport or TriggerListenerSupport

而且在配置文件添加如下內容來生效監聽器:

<!--全局任務監聽器 -->
<bean id="scheduleJobListener"
    class="com.mashu.services.task.manager.ScheduleJobListener">
    <property name="name" value="scheduleJobListener"></property>
</bean>

除了能夠配置全局的,也能夠根據業務按個,按組配置監聽器。

Quartz 2.3.0

相關文章
相關標籤/搜索