quartz2.3.0(四)JobDataMap—帶狀態集合的定時器內置集合

任務類java

package org.quartz.examples.example4;

import java.util.Date;

import org.quartz.DisallowConcurrentExecution;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.PersistJobDataAfterExecution;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 任務job。這是一個接收參數並維護狀態(先後任務能夠共享數據)的簡單做業
 */
@PersistJobDataAfterExecution //持久化JobDataMap裏的數據,使下一個定時任務還能獲取到這些值
@DisallowConcurrentExecution //禁止併發多任務執行,因此永遠只有一個任務在執行中
public class ColorJob implements Job {

    private static Logger _log = LoggerFactory.getLogger(ColorJob.class);

    // parameter names specific to this job
    public static final String FAVORITE_COLOR = "favorite color";
    public static final String EXECUTION_COUNT = "count";

    // 由於Quartz每次執行類時都會從新實例化該類,因此不能使用實例的非靜態成員變量來維護狀態!
    private int _counter = 1;

    // 必需要有public修飾的無參構造函數
    public ColorJob() {
    }

    /**
     *  這個執行方法會顯示,放在JobDataMap裏的數據在先後相關的任務中能夠有數據狀態(存在JobDataMap裏)。
     *  而類的成員變量對象_counter卻沒有狀態,每次都會被初始化爲1.
     */
    public void execute(JobExecutionContext context) throws JobExecutionException {

        // 這個做業只是打印出它的做業名稱以及它運行的日期和時間
        JobKey jobKey = context.getJobDetail().getKey();

        // 獲取並打印傳遞的參數
        JobDataMap data = context.getJobDetail().getJobDataMap();
        String favoriteColor = data.getString(FAVORITE_COLOR);
        int count = data.getInt(EXECUTION_COUNT);
        _log.info("ColorJob: " + jobKey + " executing at " + new Date() + "\n" + "  favorite color is " + favoriteColor
                + "\n" + "  execution count (from job map) is " + count + "\n"
                + "  execution count (from job member variable) is " + _counter);

        // job執行計數器+1
        count++;
        data.put(EXECUTION_COUNT, count);

        // 增長局部成員變量
        // 這沒有實際用途,由於做業狀態不能經過成員變量維護!
        _counter++;
        try {
            Thread.sleep(60L * 1000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

 

調度管理類併發

 

package org.quartz.examples.example4;

import static org.quartz.DateBuilder.nextGivenSecondDate;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;

import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SchedulerMetaData;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Date;

/**
 * 這個案例將演示如何將做業參數傳遞到做業中,以及如何維護狀態
 */
public class JobStateExample {

    public void run() throws Exception {
        Logger log = LoggerFactory.getLogger(JobStateExample.class);

        // 初始化一個調度工廠,並實例化一個調度類
        SchedulerFactory sf = new StdSchedulerFactory();
        Scheduler sched = sf.getScheduler();

        //第一個參數:null就是默認當前時間,也能夠指定時間
        // 第二個參數:把一分鐘按30進行劃分,也就是60/30等份。
        //舉例:當前時間是21:01:27,那麼startTime就是21:01:30。當前時間是21:01:32,那麼startTime就是21:02:00。
        Date startTime = nextGivenSecondDate(null, 10);

        // ========================================================
        // ============ job1 將運行五次,啓動一次重複4次,每隔10秒執行一次
        // ========================================================
        JobDetail job1 = newJob(ColorJob.class).withIdentity("job1", "group1").build();
        SimpleTrigger trigger1 = newTrigger().withIdentity("trigger1", "group1").startAt(startTime)
                .withSchedule(simpleSchedule().withIntervalInSeconds(10).withRepeatCount(4)).build();
        // 往job1的JobDataMap放入初始化數據
        job1.getJobDataMap().put(ColorJob.FAVORITE_COLOR, "Green");
        job1.getJobDataMap().put(ColorJob.EXECUTION_COUNT, 1);

        // 調度任務運行
        Date scheduleTime1 = sched.scheduleJob(job1, trigger1);
        log.info(job1.getKey() + " will run at: " + scheduleTime1 + " and repeat: " + trigger1.getRepeatCount()
                + " times, every " + trigger1.getRepeatInterval() / 1000 + " seconds");

        // ========================================================
        // ============ job2 將運行五次,啓動一次重複4次,每隔10秒執行一次
        // ========================================================
        JobDetail job2 = newJob(ColorJob.class).withIdentity("job2", "group1").build();
        SimpleTrigger trigger2 = newTrigger().withIdentity("trigger2", "group1").startAt(startTime)
                .withSchedule(simpleSchedule().withIntervalInSeconds(10).withRepeatCount(4)).build();

        // 往job2的JobDataMap放入初始化數據
        // 這個job任務喜歡的顏色是紅色了!
        job2.getJobDataMap().put(ColorJob.FAVORITE_COLOR, "Red");
        job2.getJobDataMap().put(ColorJob.EXECUTION_COUNT, 1);

        // 調度任務運行
        Date scheduleTime2 = sched.scheduleJob(job2, trigger2);
        log.info(job2.getKey().toString() + " will run at: " + scheduleTime2 + " and repeat: "
                + trigger2.getRepeatCount() + " times, every " + trigger2.getRepeatInterval() / 1000 + " seconds");

        // 啓動調度
        sched.start();

        try {
            Thread.sleep(10L * 1000L);   // 等待60秒
        } catch (Exception e) {
        }
        
        /**
         * 終止調度。
         * 可是若是當前仍然有任務正在運行中,則會等待該任務執行完畢再終止,期間debug信息會打印:
         * 21:48:54.965 [main] DEBUG org.quartz.simpl.SimpleThreadPool - Waiting for thread TestScheduler_Worker-1 to shut down
         */
        sched.shutdown(true); //終止調度

        SchedulerMetaData metaData = sched.getMetaData();
        log.info("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");

    }

    public static void main(String[] args) throws Exception {
        JobStateExample example = new JobStateExample();
        example.run();
    }

}
相關文章
相關標籤/搜索