1.关于Quartz的配置文件说明
#
# Quartz会优先读取项目下我们自定义这个quartz.properties配置文件 否则会去读取quartzjar包下org.quatrz包
# 下面的那个quartz.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
#线程池属性
#线程池的实现类(一般SimpleThreadPool可以满足所有用户的需求)
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
#指定线程数 至少为1
org.quartz.threadPool.threadCount: 10
#指定线程的优先级 最大为10 最小为1
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
org.quartz.jobStore.misfireThreshold: 60000
org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore
2.创建一个job 编写我们定时器要执行的任务
package cn.gc.helloquartz;
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;
/**
* Quartz 业务逻辑层 实现Job 重写execute方法
*
* 主要三个组件 Job Scheduler trieger
* @author Superb
*
*/
public class HelloJob implements Job{
private String message;
private double math;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
// TODO Auto-generated method stub
Date date=new Date();
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(simpleDateFormat.format(date));
//获取该job的基本信息 name是什么 属于哪个组
JobKey key=context.getJobDetail().getKey();
key.getName();
key.getGroup();
TriggerKey triggerKey=context.getTrigger().getKey();
triggerKey.getName();
triggerKey.getGroup();
/*获取Scheduler传入JobDetail中的参数 和trigger中的参数
(1.直接从Map中获取,2.Job实现类添加对应Map中键值的属性,并加get set方法,然后使用属性自动会获取相应的值)*/
//第一种方法
//分开获取JobDetail和trigger的JobDataMap
/*还可以拿到他们共同的JobDataMap 这种情况当jobDatil和trigger中有key值相同的情况
jobDataMap只获取trigger中的参数值
JobDataMap mergerdDataMap=context.getMergedJobDataMap();*/
/*JobDataMap jobDataMap=context.getJobDetail().getJobDataMap();
String jobMessage=jobDataMap.getString("message");
System.out.println(jobMessage);
float f=jobDataMap.getFloat("math");
System.out.println(f);
JobDataMap triggerDataMap=context.getTrigger().getJobDataMap();
String triMessage=triggerDataMap.getString("message");
System.out.println(triMessage);
double d=triggerDataMap.getDouble("math");
System.out.println(d);*/
//第二种方法 建立JobDataMap中对应键值的成员属性 加上get set方法 直接拿去成员变量得值
System.out.println(message);
System.out.println(math);
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public double getMath() {
return math;
}
public void setMath(double math) {
this.math = math;
}
}
3.创建一个Scheduler执行我们的job任务
package cn.gc.helloquartz;
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.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
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实列与创建的Job绑定
JobDetail jobDetail=JobBuilder.newJob(HelloJob.class).withIdentity("myJob", "group1")
//jobDetail和trigger均可以使用usingJobData方法传入参数
//在我们的Job实现类中均可以JobExecutionContext获取这些参数值
.usingJobData("message", "jobDetail")
.usingJobData("math", 8.20F)
.build();
//创建一个Trigger实列 定义该job立即执行 并每2秒执行一次
/*Trigger trigger=TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1")
.usingJobData("message", "trigger")
.usingJobData("math", 55.0D)
//设置触发器执行的开始时间和结束时间
//.startAt(new Date()).endAt(new Date())
//表示程序一启动就立马执行
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule().
//每两秒 无线重复的执行下去、
withIntervalInSeconds(2).repeatForever()).build();*/
SimpleTrigger trigger=(SimpleTrigger)TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1")
.startAt(new Date())
//.endAt(triggerEndTime)
.withSchedule(SimpleScheduleBuilder
.simpleSchedule()
//2你们秒执行一次
.withIntervalInMilliseconds(2)
//一直执行下去
//.withRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY)
//执行多少次
.withRepeatCount(10)).build();
//输出jobDetail的name值“myJob”
System.out.println(jobDetail.getKey().getName());
//输出jobDetail的group分组名 如果在创建jobDetail时不设置分组 则默认分在DEFAULT分组中
System.out.println(jobDetail.getKey().getGroup());
//trigger(触发器和上面jobDetail是一样可以获取name值和分组名)
System.out.println(trigger.getKey().getName());
System.out.println(trigger.getKey().getGroup());
//创建schedule实列
SchedulerFactory sFactory=new StdSchedulerFactory();
Scheduler scheduler=sFactory.getScheduler();
//启动任务
scheduler.start();
//挂起任务 当我们再次调用start()方法时就可以重新启动任务
//scheduler.standby();
//关闭任务可以传入参数bulean true等待所有的job任务执行完毕再关闭,false直接关闭 默认就是false 这个是不能再次调用start()方法的
scheduler.shutdown();
//返回一个Date 指的是最近要出发的一次执行时间
scheduler.scheduleJob(jobDetail, trigger);
}
//使用Trigger实现定时器
public void Trigger() throws SchedulerException{
//创建一个jobDetail实列与创建的Job绑定
JobDetail jobDetail=JobBuilder.newJob(HelloJob.class).withIdentity("myJob", "group1")
//jobDetail和trigger均可以使用usingJobData方法传入参数
//在我们的Job实现类中均可以JobExecutionContext获取这些参数值
.usingJobData("message", "jobDetail")
.usingJobData("math", 8.20F)
.build();
//创建一个Trigger实列 定义该job立即执行 并每2秒执行一次
Trigger trigger=TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1")
.usingJobData("message", "trigger")
.usingJobData("math", 55.0D)
//设置触发器执行的开始时间和结束时间
//.startAt(new Date()).endAt(new Date())
//表示程序一启动就立马执行
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule().
//每两秒 无线重复的执行下去
withIntervalInSeconds(2).repeatForever()).build();
//输出jobDetail的name值“myJob”
System.out.println(jobDetail.getKey().getName());
//输出jobDetail的group分组名 如果在创建jobDetail时不设置分组 则默认分在DEFAULT分组中
System.out.println(jobDetail.getKey().getGroup());
//trigger(触发器和上面jobDetail是一样可以获取name值和分组名)
System.out.println(trigger.getKey().getName());
System.out.println(trigger.getKey().getGroup());
//创建schedule实列
SchedulerFactory sFactory=new StdSchedulerFactory();
Scheduler scheduler=sFactory.getScheduler();
scheduler.start();
scheduler.scheduleJob(jobDetail, trigger);
}
//使用SimpleTrigger进行定时任务的执行
public void SimpleTrigger() throws SchedulerException{
//创建一个jobDetail实列与创建的Job绑定
JobDetail jobDetail=JobBuilder.newJob(HelloJob.class).withIdentity("myJob", "group1")
//jobDetail和trigger均可以使用usingJobData方法传入参数
//在我们的Job实现类中均可以JobExecutionContext获取这些参数值
.usingJobData("message", "jobDetail")
.usingJobData("math", 8.20F)
.build();
SimpleTrigger trigger=(SimpleTrigger)TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1")
.startAt(new Date())
//.endAt(triggerEndTime)
.withSchedule(SimpleScheduleBuilder
.simpleSchedule()
//2秒执行一次
.withIntervalInMilliseconds(2)
//一直执行下去
//.withRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY)
//执行多少次
.withRepeatCount(10)).build();
//输出jobDetail的name值“myJob”
System.out.println(jobDetail.getKey().getName());
//输出jobDetail的group分组名 如果在创建jobDetail时不设置分组 则默认分在DEFAULT分组中
System.out.println(jobDetail.getKey().getGroup());
//trigger(触发器和上面jobDetail是一样可以获取name值和分组名)
System.out.println(trigger.getKey().getName());
System.out.println(trigger.getKey().getGroup());
//创建schedule实列
SchedulerFactory sFactory=new StdSchedulerFactory();
Scheduler scheduler=sFactory.getScheduler();
scheduler.start();
scheduler.scheduleJob(jobDetail, trigger);
}
//使用CronTrigger 来进行定时任务的调度 CornTrigger最强大 最常用
public void CronTrigger(){
//创建一个JobDetail与Job实列绑定 //不传入分组参数时 默认属于DEFAULT分组中
JobDetail jobDetail=JobBuilder.newJob(HelloJob.class).withIdentity("myJob").build();
CronTrigger trigger=(CronTrigger) TriggerBuilder.newTrigger()
.withIdentity("cronTrigger", "group1")
.withSchedule(
//创建Cron表达式 格式(秒 分 时 日 月 周 年)
//这个表示每秒都执行
CronScheduleBuilder.cronSchedule("* * * * ? * *")
).build();
}
}