Quartz框架

Quartz框架

在这里插入图片描述

三大核心:调度器,任务,触发器
JobDetail:包含了任务的实现类以及类的信息
tigger:触发器,决定任务什么时候调用
scheduler:调度器,调用一系列方法定时定频率的执行JobDetail的信息,将JobDetail和tigger绑定在了一起

Java定时任务调度工具详解之Quartz篇(中级)一:浅谈JobExecutionContext&JobDatai&浅谈Trigger

Java定时任务调度工具详解之Quartz篇(中级)二:SimpleTrigger& CronTrigger&浅谈Scheduler&QuartzProperties文件

HelloJob类

package HelloQuartz.helloQuartz;

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 {
        //打印当前的执行时间,格式为2017-01-01 00:00:00
        Date date = new Date();
        SimpleDateFormat sf =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Current Exec Time Is :" + sf.format(date));
        //编写具体的业务逻辑
        System.out.println("Hello World!");
    }
}

HelloScheduler类

package HelloQuartz.helloQuartz;

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.SchedulerFactory;
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:任务;HelloJob.class:任务类
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
        		//标志:name、组:group
                .withIdentity("myJob", "group1").build();
        //创建一个Trigger实例,定义该job立即执行,并且每隔两秒钟重复执行一次,直到永远
        //Trigger:触发器;
        Trigger triger = TriggerBuilder.newTrigger()
        		//标志、组
                .withIdentity("myTrigger","group1")
                //现在执行
                .startNow()
                //每隔2s执行一次
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInSeconds(2)
                        .repeatForever())
                .build();
        //创建Scheduler实例
        SchedulerFactory sfact = new StdSchedulerFactory();
        //调度器
        Scheduler scheduler = sfact.getScheduler();
        scheduler.start();
        Date date = new Date();
        SimpleDateFormat sf =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Current Exec Time Is :" + sf.format(date));
        //调用器将任务和触发器绑定
        scheduler.scheduleJob(jobDetail, triger);
    }
}

浅谈Job&JobDatail

四个属性:name、group、jobClass、jobDataMap

HelloScheduler类新增内容

//创建一个JobDetail示例,将该示例与HelloJob Class绑定
//jobClass:HelloJob
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
		//name:myJob;group:group1(group不写默认为:DEFAULT)
		.withIdentity("myJob", "group1").build();
//获取name
System.out.println("jobDetail's name:" + jobDetail.getKey().getName());
//获取group
System.out.println("jobDetail's group:" + jobDetail.getKey().getGroup());
//获取jobClass
System.out.println("jobDetail's jobClass:" + jobDetail.getJobClass().getName());

HelloScheduler类完整内容

package com.imooc.demo.HelloQuartz;

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

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class HelloScheduler {
	public static void main(String[] args) throws SchedulerException, InterruptedException {
		//创建一个JobDetail示例,将该示例与HelloJob Class绑定
		//jobClass:HelloJob
		JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
				//name:myJob;group:group1(group不写默认为:DEFAULT)
				.withIdentity("myJob", "group1").build();
		//获取name
		System.out.println("jobDetail's name:" + jobDetail.getKey().getName());
		//获取group
		System.out.println("jobDetail's group:" + jobDetail.getKey().getGroup());
		//获取jobClass
		System.out.println("jobDetail's jobClass:" + jobDetail.getJobClass().getName());

		// 创建一个Trigger实例,定义该job立即执行,并且每隔两秒钟重复执行一次,直到永远
		Trigger triger = TriggerBuilder.newTrigger()
				.withIdentity("myTrigger","group1")
				.startNow()
				.withSchedule(SimpleScheduleBuilder.simpleSchedule()
								.withIntervalInSeconds(2)
								.repeatForever())
				.build();
		//创建Scheduler实例
		SchedulerFactory sfact = new StdSchedulerFactory();
		Scheduler scheduler = sfact.getScheduler();
		scheduler.start();
		Date date = new Date();
		SimpleDateFormat sf =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println("Current Exec Time Is :" + sf.format(date));
		scheduler.scheduleJob(jobDetail, triger);
	}
}

运行结果:

jobDetail's name:myJob
jobDetail's group:group1
jobDetail's jobClass:com.imooc.demo.HelloQuartz.HelloJob

浅谈JobExecutionContext&JobDataMap

JobExecutionContext是什么?
当Scheduler调用一个Job,就会将JobExecutionContext传递给Job的execute()方法;
Job能通过JobExecutionContext对象访问到Quartz运行时候的环境以及Job本身的明细数据

JobDataMap是什么?
在进行任务调度时,JobDataMap存储在JobExecutionContext中,非常方便获取
JobDataMap可以用来装载任何可序列化的数据对象,当job实例对象被执行时这些参数对象会传递给它。
JobDataMap实现了JDK的Map接口,并且添加了一些非常方便的方法用来存取基本数据类型。

获取JobDataMap的两种方式

第一种方式从Map中直接获取

代码示例:

HelloScheduler类中新增usingJobData自定义参数

//创建一个JobDetail示例,将该示例与HelloJob Class绑定
//jobClass:HelloJob
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
		//name:myJob;group:group1(group不写默认为:DEFAULT)
		.withIdentity("myJob", "group1")
		//JobDetail传入自定义参数:key-value
		.usingJobData("message","hello myJob1")
		//JobDetail传入自定义参数:key-value
		.usingJobData("mathJobValue",3.14F).build();

// 创建一个Trigger实例,定义该job立即执行,并且每隔两秒钟重复执行一次,直到永远
Trigger triger = TriggerBuilder.newTrigger()
		.withIdentity("myTrigger","group1")
		//Trigger传入自定义参数:key-value
		.usingJobData("message","hello myTrigger1")
		//Trigger传入自定义参数:key-value
		.usingJobData("DoubleTriggerValue",2.0D)
		.startNow()
		.withSchedule(SimpleScheduleBuilder.simpleSchedule()
						.withIntervalInSeconds(2)
						.repeatForever())
		.build();

HelloScheduler类完整版

package com.imooc.demo.HelloQuartz;

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

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class HelloScheduler {
	public static void main(String[] args) throws SchedulerException, InterruptedException {
		//创建一个JobDetail示例,将该示例与HelloJob Class绑定
		//jobClass:HelloJob
		JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
				//name:myJob;group:group1(group不写默认为:DEFAULT)
				.withIdentity("myJob", "group1")
				//JobDetail传入自定义参数:key-value
				.usingJobData("message","hello myJob1")
				//JobDetail传入自定义参数:key-value
				.usingJobData("mathJobValue",3.14F).build();

		// 创建一个Trigger实例,定义该job立即执行,并且每隔两秒钟重复执行一次,直到永远
		Trigger triger = TriggerBuilder.newTrigger()
				.withIdentity("myTrigger","group1")
				//Trigger传入自定义参数:key-value
				.usingJobData("message","hello myTrigger1")
				//Trigger传入自定义参数:key-value
				.usingJobData("DoubleTriggerValue",2.0D)
				.startNow()
				.withSchedule(SimpleScheduleBuilder.simpleSchedule()
								.withIntervalInSeconds(2)
								.repeatForever())
				.build();
		//创建Scheduler实例
		SchedulerFactory sfact = new StdSchedulerFactory();
		Scheduler scheduler = sfact.getScheduler();
		scheduler.start();
		Date date = new Date();
		SimpleDateFormat sf =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println("Current Exec Time Is :" + sf.format(date));
		scheduler.scheduleJob(jobDetail, triger);
	}
}

HelloJob类

package com.imooc.demo.HelloQuartz;

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

import org.quartz.*;

public class HelloJob implements Job {

	@Override
	public void execute(JobExecutionContext context)
			throws JobExecutionException {
		try {
			Thread.sleep(5000L);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//打印当前的执行时间,格式为2017-01-01 00:00:00
		Date date = new Date();
		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println("Current Exec Time Is : " + sf.format(date));
		//获取JobDetail-JobKey
		JobKey key = context.getJobDetail().getKey();
		//打印出JobDetail-JobKey中的name和group
		System.out.println("My JobDetail name and group are:" + key.getName() + ":" + key.getGroup());
		//获取Trigger-TriggerKey
		TriggerKey trkey = context.getTrigger().getKey();
		//打印出JobDetail-TriggerKey中的name和group
		System.out.println("My Trigger name and group are:" + trkey.getName() + ":" + trkey.getGroup());
		//获取JobDetail-JobDataMap
		JobDataMap dataMap = context.getJobDetail().getJobDataMap();
		//获取Trigger-JobDataMap
		JobDataMap tdataMap = context.getTrigger().getJobDataMap();
		//获取JobDetail-JobDataMap中的"message"对应的值
		String jobMsg = dataMap.getString("message");
		System.out.println("jobMsg is:" + jobMsg);
		//获取JobDetail-JobDataMap中的"mathJobValue"对应的值
		Float jobFloatValue = dataMap.getFloat("mathJobValue");
		System.out.println("jobFloatValue is:" + jobFloatValue);
		//获取Trigger-JobDataMap中的"message"对应的值
		String triggerMsg = tdataMap.getString("message");
		System.out.println("triggerMsg is:" + triggerMsg);
		//获取Trigger-JobDataMap中的"DoubleTriggerValue"对应的值
		Double triggerDoubleValue = tdataMap.getDouble("DoubleTriggerValue");
		System.out.println("triggerDoubleValue is:" + triggerDoubleValue);
	}
}

打印结果:

Current Exec Time Is : 2018-09-24 15:57:20
My JobDetail name and group are:myJob:group1
My Trigger name and group are:myTrigger:group1
jobMsg is:hello myJob1
jobFloatValue is:3.14
triggerMsg is:hello myTrigger1
triggerDoubleValue is:2.0

通过context.getMergedJobDataMap()获取合并JobDetail-JobDataMap和Trigger-JobDataMap之后的DataMap

HelloJob类中的修改

//获取合并JobDetail-JobDataMap和Trigger-JobDataMap之后的DataMap
JobDataMap dataMap = context.getMergedJobDataMap();
//获取JobDetail-JobDataMap和Trigger-JobDataMap中有相同的key是"message",
//Trigger-JobDataMap中的"message"会覆盖JobDetail-JobDataMap中"message",
//而只打印Trigger-JobDataMap中的"message"对应的值
String msg = dataMap.getString("message");
System.out.println("msg is:" + msg);
//获取JobDetail-JobDataMap中的"mathJobValue"对应的值
Float jobFloatValue = dataMap.getFloat("mathJobValue");
System.out.println("jobFloatValue is:" + jobFloatValue);
//获取Trigger-JobDataMap中的"DoubleTriggerValue"对应的值
Double triggerDoubleValue = dataMap.getDouble("DoubleTriggerValue");
System.out.println("triggerDoubleValue is:" + triggerDoubleValue);

HelloJob类的完整代码

package com.imooc.demo.HelloQuartz;

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

import org.quartz.*;

public class HelloJob implements Job {

	@Override
	public void execute(JobExecutionContext context)
			throws JobExecutionException {
		try {
			Thread.sleep(5000L);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//打印当前的执行时间,格式为2017-01-01 00:00:00
		Date date = new Date();
		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println("Current Exec Time Is : " + sf.format(date));
		//获取JobDetail-JobKey
		JobKey key = context.getJobDetail().getKey();
		//打印出JobDetail-JobKey中的name和group
		System.out.println("My JobDetail name and group are:" + key.getName() + ":" + key.getGroup());
		//获取Trigger-TriggerKey
		TriggerKey trkey = context.getTrigger().getKey();
		//打印出JobDetail-TriggerKey中的name和group
		System.out.println("My Trigger name and group are:" + trkey.getName() + ":" + trkey.getGroup());

		//获取合并JobDetail-JobDataMap和Trigger-JobDataMap之后的DataMap
		JobDataMap dataMap = context.getMergedJobDataMap();
		//获取JobDetail-JobDataMap和Trigger-JobDataMap中有相同的key是"message",
		//Trigger-JobDataMap中的"message"会覆盖JobDetail-JobDataMap中"message",
		//而只打印Trigger-JobDataMap中的"message"对应的值
		String msg = dataMap.getString("message");
		System.out.println("msg is:" + msg);
		//获取JobDetail-JobDataMap中的"mathJobValue"对应的值
		Float jobFloatValue = dataMap.getFloat("mathJobValue");
		System.out.println("jobFloatValue is:" + jobFloatValue);
		//获取Trigger-JobDataMap中的"DoubleTriggerValue"对应的值
		Double triggerDoubleValue = dataMap.getDouble("DoubleTriggerValue");
		System.out.println("triggerDoubleValue is:" + triggerDoubleValue);
	}
}

打印日志:

Current Exec Time Is : 2018-09-24 16:14:38
My JobDetail name and group are:myJob:group1
My Trigger name and group are:myTrigger:group1
msg is:hello myTrigger1
jobFloatValue is:3.14
triggerDoubleValue is:2.0

第二种方式:Job实现类中添加setter方法对应JobDataMap的键值(Quartz框架默认的JobFactory实现类在初始化job示例对象时会自动地调用这些setter方法)

HelloJob类

package com.imooc.demo.HelloQuartz;

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

import org.quartz.*;

public class HelloJob implements Job {

	//添加三个参数与HelloScheduler中usingJobData中的key值相同
	private String message;
	private Float mathJobValue;
	private Double DoubleTriggerValue;

	public String getMessage() {
		return message;
	}

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

	public Float getMathJobValue() {
		return mathJobValue;
	}

	public void setMathJobValue(Float mathJobValue) {
		this.mathJobValue = mathJobValue;
	}

	public Double getDoubleTriggerValue() {
		return DoubleTriggerValue;
	}

	public void setDoubleTriggerValue(Double doubleTriggerValue) {
		DoubleTriggerValue = doubleTriggerValue;
	}

	@Override
	public void execute(JobExecutionContext context)
			throws JobExecutionException {
		try {
			Thread.sleep(5000L);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//打印当前的执行时间,格式为2017-01-01 00:00:00
		Date date = new Date();
		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println("Current Exec Time Is : " + sf.format(date));
		//获取JobDetail-JobKey
		JobKey key = context.getJobDetail().getKey();
		//打印出JobDetail-JobKey中的name和group
		System.out.println("My JobDetail name and group are:" + key.getName() + ":" + key.getGroup());
		//获取Trigger-TriggerKey
		TriggerKey trkey = context.getTrigger().getKey();
		//打印出JobDetail-TriggerKey中的name和group
		System.out.println("My Trigger name and group are:" + trkey.getName() + ":" + trkey.getGroup());

		System.out.println("msg is:" + message);
		System.out.println("jobFloatValue is:" + mathJobValue);
		System.out.println("triggerDoubleValue is:" + DoubleTriggerValue);
	}
}

打印日志:

Current Exec Time Is : 2018-09-24 16:32:14
My JobDetail name and group are:myJob:group1
My Trigger name and group are:myTrigger:group1
msg is:hello myTrigger1
jobFloatValue is:3.14
triggerDoubleValue is:2.0

浅谈Trigger

Trigger是什么?
Quartz中的触发器用来告诉调度程序作业什么时候触发。即Trigger对象是用来触发执行Job的。
在这里插入图片描述
触发器通用属性:
JobKey:通过currentTrigger.getJobKey()获取与Trigger绑定的JobKey,表示job实例的标识,触发器被触发时,该指定的job实例会执行。
StartTime:表示触发器的时间表首次被触发的时间。它的值的类型是Java.util.Date
EndTime:指定触发器的不再被触发的时间。它的值的类型是Java.util.Date。

HelloScheduler添加内容

//获取距离当前时间3秒后的时间
		date.setTime(date.getTime()+3000);
		//获取距离当前时间6秒后的时间
		Date endDate = new Date();
		endDate.setTime(endDate.getTime()+6000);
		// 创建一个Trigger实例,定义该job立即执行,并且每隔两秒钟重复执行一次,直到永远
		Trigger triger = TriggerBuilder.newTrigger()
				.withIdentity("myTrigger","group1")
				//开始执行时间
				.startAt(date)
				//结束执行时间
				.endAt(endDate)
				.withSchedule(SimpleScheduleBuilder.simpleSchedule()
								.withIntervalInSeconds(2)
								.repeatForever())
				.build();

HelloScheduler完整代码

package com.imooc.demo.HelloQuartz;

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

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class HelloScheduler {
	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 Exec Time Is :" + sf.format(date));

		//创建一个JobDetail示例,将该示例与HelloJob Class绑定
		//jobClass:HelloJob
		JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
				//name:myJob;group:group1(group不写默认为:DEFAULT)
				.withIdentity("myJob", "group1")
				.build();

		//获取距离当前时间3秒后的时间
		date.setTime(date.getTime()+3000);
		//获取距离当前时间6秒后的时间
		Date endDate = new Date();
		endDate.setTime(endDate.getTime()+6000);
		// 创建一个Trigger实例,定义该job立即执行,并且每隔两秒钟重复执行一次,直到永远
		Trigger triger = TriggerBuilder.newTrigger()
				.withIdentity("myTrigger","group1")
				//开始执行时间
				.startAt(date)
				//结束执行时间
				.endAt(endDate)
				.withSchedule(SimpleScheduleBuilder.simpleSchedule()
								.withIntervalInSeconds(2)
								.repeatForever())
				.build();
		//创建Scheduler实例
		SchedulerFactory sfact = new StdSchedulerFactory();
		Scheduler scheduler = sfact.getScheduler();
		scheduler.start();

		scheduler.scheduleJob(jobDetail, triger);
	}
}

HelloJob类

package com.imooc.demo.HelloQuartz;

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

import org.quartz.*;

public class HelloJob implements Job {
	
	@Override
	public void execute(JobExecutionContext context)
			throws JobExecutionException {
		try {
			Thread.sleep(5000L);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//打印当前的执行时间,格式为2017-01-01 00:00:00
		Date date = new Date();
		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println("Current Exec Time Is : " + sf.format(date));

		Trigger currentTrigger = context.getTrigger();
		System.out.println("Start Time is :" +sf.format(currentTrigger.getStartTime()));
		System.out.println("End Time is :"+sf.format(currentTrigger.getEndTime()));
		//获取与Trigger绑定的Job的一些信息
		JobKey jobKey = currentTrigger.getJobKey();
		System.out.println("JobKey info ---"+"JobName:"+jobKey.getName()+";jobGroup:"+jobKey.getGroup());
	}
}

打印结果:

Current Exec Time Is : 2018-09-24 17:15:58
Start Time is :2018-09-24 17:15:53
End Time is :2018-09-24 17:15:56
JobKey info ---JobName:myJob;jobGroup:group1

SimpleTrigger

SimpleTrigger的作用:
在一个指定时间段内执行一次作业任务,
或是在指定的时间间隔内多次执行作业任务。

Java定时任务调度工具详解之Quartz篇(中级)二:SimpleTrigger& CronTrigger&浅谈Scheduler&QuartzProperties文件

CronTrigger

CronTrigger的作用:
基于日历的作业调度器
而不是像SimpleTrigger那样精确指定间隔时间,比SimpleTrigger更常用

Cron表达式:
用于配置CronTrigger实例。
是由7个子表达式组成的字符串,描述了时间表的详细信息。
格式:[秒] [分] [小时] [日] [ 月] [周] [年]

Java定时任务调度工具详解之Quartz篇(中级)二:SimpleTrigger& CronTrigger&浅谈Scheduler&QuartzProperties文件

浅谈Scheduler

Scheduler—工厂模式

Java定时任务调度工具详解之Quartz篇(中级)二:SimpleTrigger& CronTrigger&浅谈Scheduler&QuartzProperties文件

Schduler的主要函数
Date scheduleJob(JobDetail JOBdetail,Trigger trigger)//返回的是程序最近一次将要执行的时间

void start():开始执行

void standby():挂起,执行void start()后开可以重启

void shutdown() 将schedule关闭,完全关闭,不能被重新重启

QuartzProperties文件

Java定时任务调度工具详解之Quartz篇(中级)二:SimpleTrigger& CronTrigger&浅谈Scheduler&QuartzProperties文件

程序会优先读取工程目录下quartz.properties配置文件,假如没有这个文件,就会默认去读quartz jar包里面的文件。

组成部分:

调度器属性: org.quartz.scheduler.instanceName属性用来区分特定的调度器实例,可以按照功能用途来给调度器起名。org.quartz.scheduler.instanceId属性和前者一样,也允许任何字符串,但这个值必须是在所有调度器实例中是唯一的,尤其是在一个集群当中,作为集群的唯一key。假如你想Quartz帮你生成这个值的话,可以设置为AUTO。

线程池属性: ThreadCount决定了quartz有多少个工作者线程被创建,原则上是要处理的job越多,需要处理的工作线程就越多。

threadPriority:设置工作者线程的优先级。最大值是10,最小值是1,正常值是5(默认)

org.quartz.threadPool.class 是一个实现了org.quartz.threadPool接口的权限名称

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

Quartz和Spring大合体

Quartz与Spring合体需要引入的包

<!--Spring上下文支持包-->
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context-support</artifactId>
	<version>${spring.version}</version>
</dependency>

<!--Spring事务包-->
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-tx</artifactId>
	<version>${spring.version}</version>
</dependency>

<!--quartz包-->
<dependency>
	<groupId>org.quartz-scheduler</groupId>
	<artifactId>quartz</artifactId>
	<version>2.2.3</version>
</dependency>

两种方式配置作业:
MethodInvokingJobDetailFactoryBean
JobDetailFactoryBean

<!--用MethodInvokingJobDetailFactoryBean方法创建JobDetail,会定时执行myBean中的printMessage方法-->
<bean id="simpleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
	<property name="targetObject" ref="myBean" />
	<property name="targetMethod" value="printMessage" />
</bean>

<bean id="firstComplexJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
	<!--第一个参数,关联到继承自QuartzJobBean的类,它实现了作业接口,调用作业的时候executeInternal这个方法将会执行-->
	<property name="jobClass" value="com.imooc.springquartz.quartz.FirstScheduledJob" />
	<!--可选参数,传入一些自定义参数-->
	<property name="jobDataMap">
		<map>
			<entry key="anotherBean" value-ref="anotherBean" />
		</map>
	</property>
	<property name="Durability" value="true"/>				
</bean>
<!-- 距离当前时间1秒之后执行,之后每隔两秒钟执行一次 -->
<bean id="mySimpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
    <property name="jobDetail"  ref="simpleJobDetail"/>
    <property name="startDelay"  value="1000"/>
    <property name="repeatInterval"  value="2000"/>
</bean>

<!-- 每隔5秒钟执行一次 -->
<bean id="myCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
    <property name="jobDetail"  ref="firstComplexJobDetail"/>
    <property name="cronExpression"  value="0/5 * * ? * *"/>
</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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值