Quartz_1_簡單編程式任務調度使用(SimpleTrigger)


  最近在工作中,要做定時任務的更能,最開始的時候,想到的是 JavaSE 中,自帶 Timer 及 TimerTask 聯合使用,完成定時任務。最后發現,隨着業務的復雜,JDK 中的 Timer 和 TimerTask 並不能簡單、靈活的完成定時任務的操作。於是,便學習了任務調度框架-- Quartz。在最初的學習中,網上的例子大多數是基於 quartz-2.0.0 之前的版本,但是發現,2.0.0之前的版本和 2.0.0之后的變化還是比較大的,網上給出的例子及方法,都不適用了。最后,在學習了 quartz-2.1.7 之后,大致了解了下相關的方法。現分享出來,以供學習。

  這次大概會寫到的東西,如下圖:

  第一個簡單的任務調度實例如下:

首先是自定義自己的作業類,然后是開始任務調度操作。具體的使用方法,如下代碼:

(1)自定義的作業類

/** 0.0.0.1 */
 
package com.gaoqing.common.quartz;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

/**
 * 自定義作業類
 * @author 高青
 * 2014-3-23
 */
public class MyJob implements Job{

    /**
     * 2014-3-23
     */
    public MyJob() {
        
    }
    
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        
        //得到當前作業的名稱
        String jobName = context.getJobDetail().getJobDataMap().getString("name");
        
        System.out.println(
                "當前作業開始執行了,作業的名稱為:" + jobName + 
                ",作業的時間是:" + new SimpleDateFormat("yyyy-MM-dd").format(new Date())
        );
    }

}

作業類中的邏輯就是,取出任務調度器中注冊的 JobDetail 的名稱。

(2)具體的任務調度操作如下:

/** 0.0.0.1 */
 
package com.gaoqing.common.quartz;

import java.util.Date;

import org.apache.log4j.Logger;
import org.quartz.JobBuilder;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;

/**
 * 簡單任務調度測試類
 * @author 高青
 * 2014-3-20
 */
public class SimpleQuartzTest{
    
    /** 日志對象 */
    private static Logger log = Logger.getLogger(SimpleQuartzTest.class);

    /**
     * 2014-3-20
     */
    public SimpleQuartzTest() {
        
    }

    /**
     * 主線程方法
     * author 高青
     * 2014-3-20
     * @param args 參數字符串集
     * @return void 空
     * @throws SchedulerException 調度器異常
     */
    public static void main(String[] args) throws SchedulerException {
        
        //得到一個默認的調度器
        Scheduler defaultScheduler = StdSchedulerFactory.getDefaultScheduler();
        
        //得到具體的和指定作業相關的 JobDetail 對象
        JobDetail jobDetail = JobBuilder.              //2.0.0之后,JobDetail 變成了接口,不能用之前的 new JobDetail()來實例了,現在要通過相應的作業建造器來管理生成
                                newJob(MyJob.class).
                                withIdentity("myFirstJob", "firstJob").
                                build();              //要調用建造器的 build()方法,才能實例當前作業的具體作業對象
        
        //得到作業的參數對象
        JobDataMap jobDataMap = jobDetail.getJobDataMap();   //可以向作業數據對象中,存放自己需要的數據,在自己實現的 Job 類中,可以通過 context 得到相應的參數,以便做業務處理
        jobDataMap.put("myFirstJob", "first");     
        jobDataMap.put("name", "myFirstJob");     
        
        //實例化觸發器對象(定義執行的時間和執行的周期)
        SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger(). //同上,觸發器的也需要相應的建造器來實例化觸發器,現在的 Trigger 也是接口,不能通過 new Trigger() 來實例化了
                withIdentity(TriggerKey.triggerKey("myFirstTigger", "myFirstGroup")).
                withSchedule(                       //在得到對應的 SimpleTrigger 時,需要通過觸發器建造器的 widthSchedule()方法,建造對應的觸發器
                        SimpleScheduleBuilder.
                        simpleSchedule().
                        repeatForever().
                        withIntervalInSeconds(5)
                        ).
                        startAt(new Date()).
                        build();
        
        //添加調度作業(將具體的作業和觸發器添加到作業中)
        defaultScheduler.scheduleJob(jobDetail, simpleTrigger);

        //執行調度任務
        defaultScheduler.start();
    }
}

  上面就是一個簡單的任務調度的實現,和之前的版本相比,變化還是挺大了,個人感覺后面的版本更強調了性能和多任務處理。本文主要旨在實用,並不講解大量的理論,理論在網上都是可以搜到的。希望自己的一點點分享,能對他人有一點點的幫助。下一篇,將寫一個簡單的任務調度實例,使用更能強大的 CronTrigger 觸發器來實現任務調度功能。

  


免責聲明!

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



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