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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值