1. 程式人生 > >Quartz理解與實現

Quartz理解與實現

記錄關於Quartz定時排程任務的知識點,知識點主要分為兩個部分,第一個部分介紹Quartz,第二部分使用Quartz+Spring來配置使用Quartz的實際操作。

(一)Quartz知識點

Quartz是完全由java開發的一個開源的任務日程管理系統,“任務進度管理器”就是一個在預先確定的時間到達時,負責執行(或者通知)其他元件的系統。 

一句話概括:Quartz框架的核心就是排程器;

Quartz 具有以下特點:強大的排程功能,靈活的應用方式,分散式和叢集能力。

我認為企業級應用Quartz框架的原因應該主要是它的分散式和叢集能力,尤其是配合Zookeeper進行開發。

quartz排程核心元素

  1. Scheduler:任務排程器,是實際執行任務排程的控制器。在spring中通過SchedulerFactoryBean封裝起來。
  2. Trigger:觸發器,用於定義任務排程的時間規則,有SimpleTrigger,CronTrigger,DateIntervalTrigger和NthIncludedDayTrigger,其中CronTrigger用的比較多。
  3. JobDetail:用來描述Job實現類及其它相關的靜態資訊,如Job名字、關聯監聽器等資訊。在spring中有JobDetailFactoryBean和 MethodInvokingJobDetailFactoryBean兩種實現,如果任務排程只需要執行某個類的某個方法,就可以通過MethodInvokingJobDetailFactoryBean來呼叫。
  4. Job:是一個介面,只有一個方法void execute(JobExecutionContext context),開發者實現該介面定義執行任務。

(二)Quartz在Spring中的實際應用

下面給出我配置的一個定時任務,而該任務的實現可以根據具體的場景進行實現。

首先配置Spring:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--新新增的定時任務QuartzTestJob-->
    <bean id="quartzTestJob"
          class="cn.mwee.service.shop.quartz.QuartzTestJob" />

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

    <bean id="quartzTestTrigger"
          class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="quartzTestTask"/>
        <!--cron表示式-->
        <property name="cronExpression" value="*/10 * * * * ?"/>
    </bean>


    <!-- 總管理類 -->
    <bean id="startQuartz"
          class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="autoStartup" value="false"/>
        <property name="triggers">
            <list>
                <!--<ref bean="koubeiCueWordTrigger"/>-->
                <ref bean="quartzTestTrigger"/>
            </list>
        </property>
    </bean>
</beans>

具體實現的任務類QuartzTestJob:

public class QuartzTestJob extends AbstractBaseJob{
    @Override
    public void work() {
        logger.info("QuartzTestJob START");

        logger.info("QuartzTestJob OVER");
    }
}

這樣就配置好了定時任務,具體的啟動程式碼就不給出來,主要是提供一個設定Quartz排程任務的思想與方向。