java定時任務之quartz總結

quartz特點

1強大的調度功能

spring默認的任務調度框架;提供有調度運行的持久化機制,可以保存並恢復調度現場;

2靈活的應用方式

能夠靈活調度任務時間表,並對任務觸發器進行關聯映射;組件式的監聽器及各類插件、線程池,支持多種組合方式和多種數據的存儲方式

3分佈式和集羣能力

quartz中用到的主要設計模式

builder模式 ; 組件模式 ; factory模式; 鏈式寫法

quartz三個核心概念

調度器,任務,觸發器

quartz實例

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

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

public class HelloJob implements Job{

    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        // 打印當前的時間,格式爲2016-11-11 00:00:00
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("current time is :" + sf.format(date));

    }

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

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class HelloScheduler {
    public static void main(String[] args) throws SchedulerException {
        // 創建一個jobDetail實例,將該實例與HelloJob.class綁定
    JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
                .withIdentity("myjob", "group1").build();
    System.out.println("jobDetail's name:" + jobDetail.getKey().getName());
    System.out.println("jobDetail's group:" + jobDetail.getKey().getGroup()); // 如果未設置group,則默認爲DEFAULT
    System.out.println("jobDetail's jobClass:" + jobDetail.getJobClass().getName());
    // 創建一個trigger實例,定義該job立即執行,並且每隔兩秒重複執行一次,直到永遠
        Trigger trigger = TriggerBuilder.newTrigger()
        .withIdentity("mytrigger", "group1")
        .startNow().withSchedule(
                SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(2).repeatForever()
                ).build();
        // 創建Scheduler實例
        StdSchedulerFactory sfact = new StdSchedulerFactory();
        Scheduler scheduler = sfact.getScheduler();
        scheduler.start();
        // 打印當前的時間,格式爲2016-11-11 00:00:00
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("current time is :" + sf.format(date));
        scheduler.scheduleJob(jobDetail, trigger);
    }
}

console

jobDetail’s name:myjob
jobDetail’s group:group1
jobDetail’s jobClass:com.sudi.study.quartz.HelloJob
current time is :2018-02-26 16:28:23
current time is :2018-02-26 16:28:23
current time is :2018-02-26 16:28:25
current time is :2018-02-26 16:28:27

獲取jobExecutionContext相關信息及jobDataMap實例

代碼實例獲取

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

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.TriggerKey;

public class HelloJob2 implements Job{

    public void execute(JobExecutionContext context) throws JobExecutionException {
        // 打印當前的時間,格式爲2016-11-11 00:00:00
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("current time is :" + sf.format(date));
        JobKey key = context.getJobDetail().getKey();
        System.out.println("My job name and group are :" + key.getName() + ":" 
        + key.getGroup());
        TriggerKey trKey = context.getTrigger().getKey();
        System.out.println("My trigger name and group are :" + trKey.getName() + ":" 
        + trKey.getGroup());
        JobDataMap dataMap = context.getJobDetail().getJobDataMap();
        JobDataMap trDataMap = context.getTrigger().getJobDataMap();
        String jobMsg = dataMap.getString("message");
        float floatJobValue = dataMap.getFloat("FloatJobValue");
        String trJobMsg = trDataMap.getString("message");
        double doubleTriggerValue = trDataMap.getDouble("DoubleTriggerValue");
        System.out.println("jobMsg is:" + jobMsg);
        System.out.println("floatJobValue is:" + floatJobValue);
        System.out.println("trJobMsg is:" + trJobMsg);
        System.out.println("doubleTriggerValue is:" + doubleTriggerValue);


    }

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

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class HelloScheduler2 {
    public static void main(String[] args) throws SchedulerException {
        // 創建一個jobDetail實例,將該實例與HelloJob.class綁定
    JobDetail jobDetail = JobBuilder.newJob(HelloJob2.class)
                .withIdentity("myjob")
                .usingJobData("message", "hello myjob1")
                .usingJobData("FloatJobValue", 3.14F).build();

    // 創建一個trigger實例,定義該job立即執行,並且每隔兩秒重複執行一次,直到永遠
        Trigger trigger = TriggerBuilder.newTrigger()
        .withIdentity("mytrigger", "group1")
        .usingJobData("message", "hello mytrigger1")
        .usingJobData("DoubleTriggerValue", 2.0)
        .startNow().withSchedule(
                SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(2).repeatForever()
                ).build();
        // 創建Scheduler實例
        StdSchedulerFactory sfact = new StdSchedulerFactory();
        Scheduler scheduler = sfact.getScheduler();
        scheduler.start();
        // 打印當前的時間,格式爲2016-11-11 00:00:00
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("current time is :" + sf.format(date));
        scheduler.scheduleJob(jobDetail, trigger);
    }
}
import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.TriggerKey;

public class HelloJob3 implements Job{

    public void execute(JobExecutionContext context) throws JobExecutionException {
        // 打印當前的時間,格式爲2016-11-11 00:00:00
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("current time is :" + sf.format(date));
        JobKey key = context.getJobDetail().getKey();
        System.out.println("My job name and group are :" + key.getName() + ":" 
        + key.getGroup());
        TriggerKey trKey = context.getTrigger().getKey();
        System.out.println("My trigger name and group are :" + trKey.getName() + ":" 
        + trKey.getGroup());
        JobDataMap dataMap = context.getMergedJobDataMap();
        String jobMsg = dataMap.getString("message");
        float floatJobValue = dataMap.getFloat("FloatJobValue");
        //String trJobMsg = dataMap.getString("message");當key值相同時trigger中的value會覆蓋job中的value
        double doubleTriggerValue = dataMap.getDouble("DoubleTriggerValue");
        System.out.println("jobMsg is:" + jobMsg);
        System.out.println("floatJobValue is:" + floatJobValue);
        System.out.println("doubleTriggerValue is:" + doubleTriggerValue);


    }

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

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class HelloScheduler3 {
    public static void main(String[] args) throws SchedulerException {
        // 創建一個jobDetail實例,將該實例與HelloJob.class綁定
    JobDetail jobDetail = JobBuilder.newJob(HelloJob3.class)
                .withIdentity("myjob")
                .usingJobData("message", "hello myjob1")
                .usingJobData("FloatJobValue", 3.14F).build();

    // 創建一個trigger實例,定義該job立即執行,並且每隔兩秒重複執行一次,直到永遠
        Trigger trigger = TriggerBuilder.newTrigger()
        .withIdentity("mytrigger", "group1")
        .usingJobData("message", "hello mytrigger1")
        .usingJobData("DoubleTriggerValue", 2.0)
        .startNow().withSchedule(
                SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(2).repeatForever()
                ).build();
        // 創建Scheduler實例
        StdSchedulerFactory sfact = new StdSchedulerFactory();
        Scheduler scheduler = sfact.getScheduler();
        scheduler.start();
        // 打印當前的時間,格式爲2016-11-11 00:00:00
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("current time is :" + sf.format(date));
        scheduler.scheduleJob(jobDetail, trigger);
    }
}
import java.text.SimpleDateFormat;
import java.util.Date;

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

public class HelloJob4 implements Job{
    private String message;
    private Float floatJobValue;
    private Double doubleTriggerValue;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Float getFloatJobValue() {
        return floatJobValue;
    }

    public void setFloatJobValue(Float floatJobValue) {
        this.floatJobValue = floatJobValue;
    }

    public Double getDoubleTriggerValue() {
        return doubleTriggerValue;
    }

    public void setDoubleTriggerValue(Double doubleTriggerValue) {
        this.doubleTriggerValue = doubleTriggerValue;
    }

    public void execute(JobExecutionContext context) throws JobExecutionException {
        // 打印當前的時間,格式爲2016-11-11 00:00:00
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("current time is :" + sf.format(date));
        JobKey key = context.getJobDetail().getKey();
        System.out.println("My job name and group are :" + key.getName() + ":" 
        + key.getGroup());
        TriggerKey trKey = context.getTrigger().getKey();
        System.out.println("My trigger name and group are :" + trKey.getName() + ":" 
        + trKey.getGroup());
        System.out.println("jobMsg is:" + message);
        System.out.println("floatJobValue is:" + floatJobValue);
        System.out.println("doubleTriggerValue is:" + doubleTriggerValue);


    }

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

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class HelloScheduler4 {
    public static void main(String[] args) throws SchedulerException {
        // 創建一個jobDetail實例,將該實例與HelloJob.class綁定
    JobDetail jobDetail = JobBuilder.newJob(HelloJob4.class)
                .withIdentity("myjob")
                .usingJobData("message", "hello myjob1")
                .usingJobData("FloatJobValue", 3.14F).build();

    // 創建一個trigger實例,定義該job立即執行,並且每隔兩秒重複執行一次,直到永遠
        Trigger trigger = TriggerBuilder.newTrigger()
        .withIdentity("mytrigger", "group1")
        .usingJobData("message", "hello mytrigger1")
        .usingJobData("DoubleTriggerValue", 2.0)
        .startNow().withSchedule(
                SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(2).repeatForever()
                ).build();
        // 創建Scheduler實例
        StdSchedulerFactory sfact = new StdSchedulerFactory();
        Scheduler scheduler = sfact.getScheduler();
        scheduler.start();
        // 打印當前的時間,格式爲2016-11-11 00:00:00
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("current time is :" + sf.format(date));
        scheduler.scheduleJob(jobDetail, trigger);
    }
}

trigger和jobkey信息實例

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

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

public class HelloJob5 implements Job{

    public void execute(JobExecutionContext context) throws JobExecutionException {
        // 打印當前的時間,格式爲2016-11-11 00:00:00
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("current time is :" + sf.format(date));
        Trigger currentTrigger = context.getTrigger();
        System.out.println("start time is:" +currentTrigger.getStartTime());
        System.out.println("end time is:" +currentTrigger.getEndTime());
        JobKey jobKey = currentTrigger.getJobKey();
        System.out.println("jobKey info---" + "jobName:" + jobKey.getName() + "jobGroup:" + jobKey.getGroup());
    }

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

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class HelloScheduler5 {
    public static void main(String[] args) throws SchedulerException {
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("current time is :" + sf.format(date));
        // 獲取距離當前時間3秒的時間
        date.setTime(date.getTime() + 3000L);
        // 獲取距離當前時間6秒的時間
        Date endDate = new Date();
        endDate.setTime(endDate.getTime() + 6000L);

        // 創建一個jobDetail實例,將該實例與HelloJob.class綁定
    JobDetail jobDetail = JobBuilder.newJob(HelloJob5.class)
                .withIdentity("myjob").build();

    // 創建一個trigger實例,定義該job立即執行,並且每隔兩秒重複執行一次,直到永遠
        Trigger trigger = TriggerBuilder.newTrigger()
        .withIdentity("mytrigger", "group1")
        .startAt(date)
        .endAt(endDate)
        .withSchedule(
                SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(2).repeatForever()
                ).build();
        // 創建Scheduler實例
        StdSchedulerFactory sfact = new StdSchedulerFactory();
        Scheduler scheduler = sfact.getScheduler();
        scheduler.start();
        scheduler.scheduleJob(jobDetail, trigger);
    }
}

console

current time is :2018-02-26 19:22:08
current time is :2018-02-26 19:22:11
start time is:Mon Feb 26 19:22:11 GMT+08:00 2018
end time is:Mon Feb 26 19:22:14 GMT+08:00 2018
jobKey info—jobName:myjobjobGroup:DEFAULT
current time is :2018-02-26 19:22:13
start time is:Mon Feb 26 19:22:11 GMT+08:00 2018
end time is:Mon Feb 26 19:22:14 GMT+08:00 2018
jobKey info—jobName:myjobjobGroup:DEFAULT

SimpleTrigger

simpleTrigger作用

在一個指定時間段內執行一次作業任務或是在指定的時間間隔內多次執行作業任務

simpleTrigger代碼實例

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

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

public class HelloJob6 implements Job{

    public void execute(JobExecutionContext context) throws JobExecutionException {
        // 打印當前的時間,格式爲2016-11-11 00:00:00
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("current time is :" + sf.format(date));
        System.out.println("Hello World!");
    }

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

import org.quartz.JobBuilder;
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.impl.StdSchedulerFactory;

public class HelloScheduler6 {
    public static void main(String[] args) throws SchedulerException {
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("current time is :" + sf.format(date));
        // 創建一個jobDetail實例,將該實例與HelloJob.class綁定
    JobDetail jobDetail = JobBuilder.newJob(HelloJob6.class)
                .withIdentity("myjob").build();
    // 創建一個trigger實例
    // 距離當前時間4秒後執行且只執行一次任務
/*  date.setTime(date.getTime() + 4000L);
        SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger()
        .withIdentity("mytrigger", "group1")
        .startAt(date)
        .build();*/
    // 距離當前時間4秒後首次執行任務,之後每隔2秒鐘重複執行一次任務
    SimpleTrigger trigger = TriggerBuilder.newTrigger()
    .withIdentity("mytrigger", "group1")
    .startAt(date)
    .withSchedule(
            SimpleScheduleBuilder.simpleSchedule()
            .withIntervalInSeconds(2).withRepeatCount(
                    SimpleTrigger.REPEAT_INDEFINITELY)
            ).build();
        // 創建Scheduler實例
        StdSchedulerFactory sfact = new StdSchedulerFactory();
        Scheduler scheduler = sfact.getScheduler();
        scheduler.start();
        scheduler.scheduleJob(jobDetail, trigger);
    }
}

console

current time is :2018-02-26 19:55:34
current time is :2018-02-26 19:55:34
Hello World!
current time is :2018-02-26 19:55:36
Hello World!
current time is :2018-02-26 19:55:38
Hello World!
current time is :2018-02-26 19:55:40
Hello World!

simpleTrigger需要注意的點

1重複次數可以爲0,正整數或simpleTrigger提供的常量值
2重複執行間隔必須爲0或長整數
3一旦被指定endtime參數,那麼它會覆蓋重複次數參數的效果

CronTrigger

cronTrigger的作用

基於日曆的作業調度器,而不是像SimpleTrigger那樣精準指定間隔時間,比SimpleTrigger更常用

cron表達式

用於配置CronTrigger實例
由7個子表達式組成的字符串,描述了時間表的詳細信息
格式:【秒】【分】【小時】【日】【月】【周】【年】
Cron表達式特殊字符意義對應表

cron 表達式舉例

表達式 含義
0 15 10 ? * * 每天10點15分觸發
0 0/5 14 * * ? 每天下午的2點到2點59分(整點開始,每隔5分鐘觸發)
0 15 10 ? * MON-FRI 從週一至週五每天上午的10點15分觸發
0 15 10 ? * 6#3 每月的第三週的星期五開始觸發
0 15 10 ? * 6L 2016-2017 從2016年到2017年每月最後一週的星期五的10點15分觸發

 Cron表達式通配符說明
cron表達式小提示:

” L”和“W”一起組合表示每月最後一個工作日
周字段英文字母不區分大小寫即MON和mon相同

cronTrigger代碼實例

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

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class HelloScheduler7 {
    public static void main(String[] args) throws SchedulerException {
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("current time is :" + sf.format(date));
        // 創建一個jobDetail實例,將該實例與HelloJob.class綁定
    JobDetail jobDetail = JobBuilder.newJob(HelloJob6.class)
                .withIdentity("myjob").build();
    // 創建一個trigger實例
    // 每秒鐘觸發一次任務
    CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger()
    .withIdentity("mytrigger", "group1")
    .startAt(date)
    .withSchedule(
            CronScheduleBuilder.cronSchedule("* * * * * ? *")
            ).build();
    // 1、2017年內每天10點15分觸發一次  0 15 10 ? * * 2017
    // 2、每天的14點到14點59分55秒,以及18點整至18點59分55秒,每5秒鐘觸發一次 0/5 59 14,18 * * ? 
    // 3、每月的週一至週五的10點15分觸發一次   * 15 10 * * MON-FRI
    // 4、每月的最後一天的的10點15分觸發一次   * 15 10 * *L ?
    // 5、每月第三個週五的10點15分觸發一次       * 15 10 * * 6#3

        // 創建Scheduler實例
        StdSchedulerFactory sfact = new StdSchedulerFactory();
        Scheduler scheduler = sfact.getScheduler();
        scheduler.start();
        scheduler.scheduleJob(jobDetail, trigger);
    }
}

scheduler代碼實例

常用API;start(),shutdown(),shutdown(true),shutdown(false)

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

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

public class HelloJob6 implements Job{

    public void execute(JobExecutionContext context) throws JobExecutionException {
        try {
            Thread.sleep(5000L);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // 打印當前的時間,格式爲2016-11-11 00:00:00
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("current time is :" + sf.format(date));
        System.out.println("Hello World!");
    }

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

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class HelloScheduler7 {
    public static void main(String[] args) throws SchedulerException, InterruptedException {
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("current time is :" + sf.format(date));
        // 創建一個jobDetail實例,將該實例與HelloJob.class綁定
    JobDetail jobDetail = JobBuilder.newJob(HelloJob6.class)
                .withIdentity("myjob").build();
    // 創建一個trigger實例
    // 每秒鐘觸發一次任務
    CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger()
    .withIdentity("mytrigger", "group1")
    .startAt(date)
    .withSchedule(
            CronScheduleBuilder.cronSchedule("* * * * * ? *")
            ).build();
    // 12017年內每天1015分觸發一次  0 15 10 ? * * 2017
    // 2、每天的14點到145955秒,以及18點整至185955秒,每5秒鐘觸發一次 0/5 59 14,18 * * ? 
    // 3、每月的週一至週五的1015分觸發一次   * 15 10 * * MON-FRI
    // 4、每月的最後一天的的1015分觸發一次   * 15 10 * *L ?
    // 5、每月第三個週五的1015分觸發一次       * 15 10 * * 6#3

        // 創建Scheduler實例
        StdSchedulerFactory sfact = new StdSchedulerFactory();
        Scheduler scheduler = sfact.getScheduler();
        scheduler.start();
        System.out.println("scheduled time is :" 
        + sf.format(scheduler.scheduleJob(jobDetail, trigger)) );

        Thread.sleep(2000L);
        // scheduler執行2秒後掛起
        //scheduler.standby();
        //shutdown(true)表示等待所有正在執行的job執行完畢之後,再關閉scheduler
        // shutdown(false)即shutdown()表示直接關閉scheduler
        //scheduler.shutdown(true);
        scheduler.shutdown(false);
        System.out.println("scheduler is shutdown ?" + scheduler.isShutdown());
        //Thread.sleep(3000L);
        // scheduler掛起3秒後繼續執行
        //scheduler.start();
        // scheduler.scheduleJob(jobDetail, trigger);
    }
}

quartz.properties配置

注:quartz.properties

    # Default Properties file for use by StdSchedulerFactory  
    # to create a Quartz Scheduler Instance, if a different  
    # properties file is not explicitly specified.  
    #  
    # ===========================================================================  
    # Configure Main Scheduler Properties 調度器屬性  
    # ===========================================================================  
    org.quartz.scheduler.instanceName: DefaultQuartzScheduler  
    #org.quartz.scheduler.instanceid:AUTO  
    org.quartz.scheduler.rmi.export: false  
    org.quartz.scheduler.rmi.proxy: false  
    org.quartz.scheduler.wrapJobExecutionInUserTransaction: false  
    # ===========================================================================    
    # Configure ThreadPool 線程池屬性    
    # ===========================================================================  
    #線程池的實現類(一般使用SimpleThreadPool即可滿足幾乎所有用戶的需求)  
    org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool  
    #指定線程數,至少爲1(無默認值)(一般設置爲1-100直接的整數合適)  
    org.quartz.threadPool.threadCount: 10  
    #設置線程的優先級(最大爲java.lang.Thread.MAX_PRIORITY 10,最小爲Thread.MIN_PRIORITY 1,默認爲5)  
    org.quartz.threadPool.threadPriority: 5  
    #設置SimpleThreadPool的一些屬性  
    #設置是否爲守護線程  
    #org.quartz.threadpool.makethreadsdaemons = false  
    #org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true  
    #org.quartz.threadpool.threadsinheritgroupofinitializingthread=false  
    #線程前綴默認值是:[Scheduler Name]_Worker  
    #org.quartz.threadpool.threadnameprefix=swhJobThead;  
    # 配置全局監聽(TriggerListener,JobListener) 則應用程序可以接收和執行 預定的事件通知  
    # ===========================================================================  
    # Configuring a Global TriggerListener 配置全局的Trigger監聽器  
    # MyTriggerListenerClass 類必須有一個無參數的構造函數,和 屬性的set方法,目前2.2.x只支持原始數據類型的值(包括字符串)  
    # ===========================================================================  
    #org.quartz.triggerListener.NAME.class = com.swh.MyTriggerListenerClass  
    #org.quartz.triggerListener.NAME.propName = propValue  
    #org.quartz.triggerListener.NAME.prop2Name = prop2Value  
    # ===========================================================================  
    # Configuring a Global JobListener 配置全局的Job監聽器  
    # MyJobListenerClass 類必須有一個無參數的構造函數,和 屬性的set方法,目前2.2.x只支持原始數據類型的值(包括字符串)  
    # ===========================================================================  
    #org.quartz.jobListener.NAME.class = com.swh.MyJobListenerClass  
    #org.quartz.jobListener.NAME.propName = propValue  
    #org.quartz.jobListener.NAME.prop2Name = prop2Value  
    # ===========================================================================    
    # Configure JobStore 存儲調度信息(工作,觸發器和日曆等)  
    # ===========================================================================  
    # 信息保存時間 默認值60秒  
    org.quartz.jobStore.misfireThreshold: 60000  
    #保存job和Trigger的狀態信息到內存中的類  
    org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore  
    # ===========================================================================    
    # Configure SchedulerPlugins 插件屬性 配置  
    # ===========================================================================  
    # 自定義插件    
    #org.quartz.plugin.NAME.class = com.swh.MyPluginClass  
    #org.quartz.plugin.NAME.propName = propValue  
    #org.quartz.plugin.NAME.prop2Name = prop2Value  
    #配置trigger執行歷史日誌(可以看到類的文檔和參數列表)  
    org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingTriggerHistoryPlugin    
    org.quartz.plugin.triggHistory.triggerFiredMessage = Trigger {1}.{0} fired job {6}.{5} at: {4, date, HH:mm:ss MM/dd/yyyy}    
    org.quartz.plugin.triggHistory.triggerCompleteMessage = Trigger {1}.{0} completed firing job {6}.{5} at {4, date, HH:mm:ss MM/dd/yyyy} with resulting trigger instruction code: {9}    
    #配置job調度插件  quartz_jobs(jobs and triggers內容)的XML文檔    
    #加載 Job 和 Trigger 信息的類   (1.8之前用:org.quartz.plugins.xml.JobInitializationPlugin)  
    org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin  
    #指定存放調度器(Job 和 Trigger)信息的xml文件,默認是classpath下quartz_jobs.xml  
    org.quartz.plugin.jobInitializer.fileNames = my_quartz_job2.xml    
    #org.quartz.plugin.jobInitializer.overWriteExistingJobs = false    
    org.quartz.plugin.jobInitializer.failOnFileNotFound = true    
    #自動掃描任務單並發現改動的時間間隔,單位爲秒  
    org.quartz.plugin.jobInitializer.scanInterval = 10  
    #覆蓋任務調度器中同名的jobDetail,避免只修改了CronExpression所造成的不能重新生效情況  
    org.quartz.plugin.jobInitializer.wrapInUserTransaction = false  
    # ===========================================================================    
    # Sample configuration of ShutdownHookPlugin  ShutdownHookPlugin插件的配置樣例  
    # ===========================================================================  
    #org.quartz.plugin.shutdownhook.class = \org.quartz.plugins.management.ShutdownHookPlugin  
    #org.quartz.plugin.shutdownhook.cleanShutdown = true  
    #  
    # Configure RMI Settings 遠程服務調用配置  
    #  
    #如果你想quartz-scheduler出口本身通過RMI作爲服務器,然後設置“出口”標誌true(默認值爲false)。  
    #org.quartz.scheduler.rmi.export = false  
    #主機上rmi註冊表(默認值localhost)  
    #org.quartz.scheduler.rmi.registryhost = localhost  
    #註冊監聽端口號(默認值1099)  
    #org.quartz.scheduler.rmi.registryport = 1099  
    #創建rmi註冊,false/never:如果你已經有一個在運行或不想進行創建註冊  
    # true/as_needed:第一次嘗試使用現有的註冊,然後再回來進行創建  
    # always:先進行創建一個註冊,然後再使用回來使用註冊  
    #org.quartz.scheduler.rmi.createregistry = never  
    #Quartz Scheduler服務端端口,默認是隨機分配RMI註冊表  
    #org.quartz.scheduler.rmi.serverport = 1098  
    #true:鏈接遠程服務調度(客戶端),這個也要指定registryhost和registryport,默認爲false  
    # 如果export和proxy同時指定爲true,則export的設置將被忽略  
    #org.quartz.scheduler.rmi.proxy = false  

整合spring的配置

    <bean id="simpleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="myBean"></property>
    <property name="targetMethod" value="printMessage"></property>
    </bean>
    <bean id="firstComplexJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="jobClass" value=""></property>
    <property name="jobDetailMap">
        <map>
        <entry></entry>
        </map>
    </property>
    <property name="Durability" value="true"></property>
    </bean>
    <!-- 距離當前時間1秒後執行,之後每隔兩秒執行一次 -->
    <bean id="mySimpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
    <property name="jobDetail" ref="simpleJobDetail"></property>
    <property name="startDelay" value="1000"></property>
    <property name="repeatInterval" value="2000"></property>
    </bean>
      <!--每隔5秒鐘執行一次  -->
    <bean id="myCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
    <property name="jobDetail" ref="firstComplexJobDetail"></property>
    <property name="cronExpression" value="0/5 * * ? * *"></property>
    </bean>
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="jobDetails">
    <list>
        <ref bean="simpleJobDetail"/>
        <ref bean="firstComplexJobDetail"/>
    </list>
    </property>
    <property name="triggers">
    <list>
    <ref bean="mySimpleTrigger"/>
    <ref bean="myCronTrigger"/>
    </list>
    </property>
    </bean>

文章總結自慕課網:Java定時任務調度工具詳解之Quartz

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章