Quartz - Quartz簡單入門

襲冷發表於2018-03-06
一、相關介紹 
    Quartz是OpenSymphony開源組織在Job scheduling領域又一個開源專案,是完全由Java開發的一個開源的任務日程管理系統

二、概念和類
    Job:要執行的作業類所實現的介面
    JobDetail:定義作業例項的詳細資訊屬性
    Trigger:觸發器介面,Quartz中提供了SimpleTrigger、CronTirgger和Calendar等多種觸發器
    Scheduler:任務記錄表,排程器例項

三、儲存方式 
    RAMJobStore:不要外部資料庫,配置容易,執行速度快
    JDBCJobStore:支援叢集,所有的任務資訊都會儲存到資料庫中。可以控制事物;應用伺服器關閉或者重啟,任務資訊都不會丟失且可以恢復因此而導致執行失敗的任務

四、執行緒模型
    排程主執行緒:QuartzScheduler被建立時會建立一個QuartzSchedulerThread的排程主執行緒例項
    任務執行執行緒:Quartz不會在主執行緒(QuartzSchedulerThread)中處理使用者的Job,而是把執行緒管理的職責委託給ThreadPool,一般的設定是使用SimpleThreadPool。SimpleThreadPool建立了一定數量的WorkerThread例項來使得Job能夠線上程中進行處理。WorkerThread是定義在SimpleThreadPool類中的內部類,它實質上就是一個執行緒

五、使用示例

package com.xl.quartz;

import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *自定義任務類
 */
public class SimpleJob implements Job {
    
    private static Logger LOG = LoggerFactory.getLogger(SimpleJob.class);

    private String desc;

    /**
     * Job是一個介面,只有一個execute方法,JobExecutionContext提供了任務排程的上下文資訊
     */
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println(context.getJobDetail().getJobDataMap().get("desc"));  // 非空
        System.out.println(this.desc);  // 為空
        LOG.debug("Job start, time={}.", new Date().getTime());
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }
    
}
package com.xl.quartz;

import java.util.Date;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Quartz啟動類
 *
 */
public class SimpleQuartzMain {
    
    private static Logger LOG = LoggerFactory.getLogger(SimpleJob.class);
    
    public static void main(String[] args) throws SchedulerException {
        /**
         * 1. 建立Scheduler的工廠
         */
        SchedulerFactory sf = new StdSchedulerFactory();

        /**
         * 2. 從工廠中獲取排程器例項
         */
        Scheduler scheduler = sf.getScheduler();

        /**
         * 3. 建立JobDetail,定義任務的實現細節和相關屬性
         */
        JobDetail simpleJobDetail = new JobDetail("simpleJD", "simpleGP", SimpleJob.class);  // 設定名字和組名標識當前任務細節
        
        simpleJobDetail.getJobDataMap().put("desc", "Description(By JobDataMap).");  // 如果Job有引數需要設定,可以從這裡賦值 (測試1.6.x,非整合Spring時不能給Job的同名屬性自動注入)

        /**
         * 4. 建立Trigger,定義觸發規則 
         *    如果嵌入的事件只觸發一次或者以固定時間間隔觸發,則使用SimpleTrigger比較合適
         *    如果嵌入的事件以固定的時間點如每天十點觸發,則使用CronTrigger比較合適
         */
        SimpleTrigger simpleTrigger = new SimpleTrigger("simpleST", "simpleTG");  // 設定名字和組名標識當前觸發器
        
        simpleTrigger.setStartTime(new Date(System.currentTimeMillis() + 2 * 1000L));  // 設定開始時間,延時2秒鐘
        simpleTrigger.setRepeatInterval(2000);  // 設定多久重複一次,2秒鐘一次
        simpleTrigger.setRepeatCount(-1);  // -1表示無限次數,0表示只執行一次,預設0

        /**
         * 5. 註冊任務和定時器
         */
        scheduler.scheduleJob(simpleJobDetail, simpleTrigger);

        /**
         * 6. 啟動排程器
         */
        scheduler.start();
        
        LOG.info("Scheduler start...");
    }
}


六、補充配置

#log4j config
log4j.rootLogger = debug,system.out  
log4j.appender.system.out=org.apache.log4j.ConsoleAppender  
log4j.appender.system.out.layout=org.apache.log4j.PatternLayout  
log4j.appender.system.out.layout.ConversionPattern=%d %p [%c] [%t] [%F:%L] - <%m>%n  
    <!-- pom.xml -->
    <dependency>
        <groupId>org.opensymphony.quartz</groupId>
        <artifactId>quartz</artifactId>
        <version>1.6.5</version>
    </dependency>
    <dependency>
        <groupId>commons-collections</groupId>
        <artifactId>commons-collections</artifactId>
        <version>3.2.1</version>
    </dependency>
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.6.1</version>
    </dependency>




相關文章