第一个quartz例子
依赖包
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>
package com.example.demo.quartz;
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绑定,然后给他创建唯一标识,属于
// 哪个组,再调用build方法将其创建出来
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity("myJob","group1").build();
//jobDetail里的属性打印
System.out.println("jobDetail's name "+jobDetail.getKey().getName());
System.out.println("jobDetail's group "+jobDetail.getKey().getGroup());
System.out.println("jobDetail's jobClass "+jobDetail.getJobClass().getName());
//创建trigger实例
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("myTrigger", "group1")//创建唯一标识,组虽然和jobDetail里的名字相同,但他们不是一回事
.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(sf.format(date));
scheduler.scheduleJob(jobDetail, trigger);
}
}
package com.example.demo.quartz;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class HelloJob implements Job {
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
//Calendar calendar = Calendar.getInstance();
Date date = new Date();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sf.format(date));
// 编写具体业务
System.out.println("hello world!");
}
}
2 浅谈job和jobDetail
job定义:实现业务逻辑的任务接口
由于不同的情景job要传的参数不同,无法通过定义构造函数初始化job,
所以会新建个job实例然后通过反射机制传参,使用
jobExecutionContext 上下文实现
自定义用户参数并获取
package com.example.demo.quartz;
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绑定,然后给他创建唯一标识,属于
// 哪个组,再调用build方法将其创建出来
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity("myJob","group1")
.usingJobData("message","hello myJob" ) //传入用户自定义的参数
.usingJobData("FloatJobValue", 3.14F) //传入用户自定义的参数
.build();
//创建trigger实例
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("myTrigger", "group1")//创建唯一标识,组虽然和jobDetail里的名字相同,但他们不是一回事
.usingJobData("message","hello myTrigger" ) //传入用户自定义的参数
.usingJobData("DoubleJobValue", 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(sf.format(date));
scheduler.scheduleJob(jobDetail, trigger);
}
}
package com.example.demo.quartz;
import java.text.SimpleDateFormat;
import java.util.Calendar;
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 HelloJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
//Calendar calendar = Calendar.getInstance();
Date date = new Date();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sf.format(date));
// 编写具体业务
//获取jobdetail里的名字和组信息
JobKey key = context.getJobDetail().getKey();
System.out.println("my job name and group are :"+key.getName()+key.getGroup());
//获取Trigger里的名字和组信息
TriggerKey tkkey = context.getTrigger().getKey();
System.out.println("my Trigger name and group are :"+tkkey.getName()+tkkey.getGroup());
//获取jobdetail里自定义的属性值
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
String jobMsg = dataMap.getString("message");
Float FloatJobValue = dataMap.getFloat("FloatJobValue");
System.out.println("自定义jobd的属性值分别是:"+jobMsg+" ------ "+FloatJobValue);
//获取Trigger里自定义的属性值
JobDataMap tdataMap = context.getTrigger().getJobDataMap();
String TriMsg = tdataMap.getString("message");
Double DoubleJobValue= tdataMap.getDouble("DoubleJobValue");
System.out.println("自定义trigger的属性值分别是:"+TriMsg+" ------ "+DoubleJobValue);
//合并获取jobDetail和Trigger里的参数
JobDataMap MergeDataMap = context.getMergedJobDataMap();
//如果job和Trigger里有相同名字的参数,优先显示Trigger里的
String mes = MergeDataMap.getString("message");
Double DoubleMes= MergeDataMap.getDouble("DoubleJobValue");
Float FloatMes = MergeDataMap.getFloat("FloatJobValue");
System.out.println("自定义trigger和job中的属性值分别是:"+mes+" ------ "+DoubleMes+"-------"+FloatMes);
}
}
通过get和set方法获取用户自定义的参
package com.example.demo.quartz;
import java.text.SimpleDateFormat;
import java.util.Calendar;
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 HelloJob implements Job {
private String message;
private Float FloatJobValue;
private Double DoubleJobValue;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Float getFloatJobValue() {
return FloatJobValue;
}
public void setFloatJobValue(Float floatJobValue) {
FloatJobValue = floatJobValue;
}
public Double getDoubleJobValue() {
return DoubleJobValue;
}
public void setDoubleJobValue(Double doubleJobValue) {
DoubleJobValue = doubleJobValue;
}
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
// Calendar calendar = Calendar.getInstance();
Date date = new Date();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sf.format(date));
// 编写具体业务
// 获取jobdetail里的名字和组信息
JobKey key = context.getJobDetail().getKey();
System.out.println("my job name and group are :" + key.getName() + key.getGroup());
// 获取Trigger里的名字和组信息
TriggerKey tkkey = context.getTrigger().getKey();
System.out.println("my Trigger name and group are :" + tkkey.getName() + tkkey.getGroup());
//通过get和set方法来获取用户自定义的参数
System.out.println("参数是:"+message+"---------"+FloatJobValue+"-----------"+DoubleJobValue);
/*
* //获取jobdetail里自定义的属性值 JobDataMap dataMap =
* context.getJobDetail().getJobDataMap(); String jobMsg =
* dataMap.getString("message"); Float FloatJobValue =
* dataMap.getFloat("FloatJobValue");
* System.out.println("自定义jobd的属性值分别是:"+jobMsg+" ------ "+FloatJobValue);
*
*
*
* //获取Trigger里自定义的属性值 JobDataMap tdataMap =
* context.getTrigger().getJobDataMap(); String TriMsg =
* tdataMap.getString("message"); Double DoubleJobValue=
* tdataMap.getDouble("DoubleJobValue");
* System.out.println("自定义trigger的属性值分别是:"+TriMsg+" ------ "+DoubleJobValue);
*
*
* //合并获取jobDetail和Trigger里的参数 JobDataMap MergeDataMap =
* context.getMergedJobDataMap();
*
* //如果job和Trigger里有相同名字的参数,优先显示Trigger里的 String mes =
* MergeDataMap.getString("message"); Double DoubleMes=
* MergeDataMap.getDouble("DoubleJobValue"); Float FloatMes =
* MergeDataMap.getFloat("FloatJobValue");
* System.out.println("自定义trigger和job中的属性值分别是:"+mes+" ------ "+DoubleMes+
* "-------"+FloatMes);
*/
}
}
开始结束时间trigger属性设置
package com.example.demo.quartz;
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 {
//打印当前的时间
Date date = new Date();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sf.format(date));
//获取距离当前时间3秒后的时间
date.setTime(date.getTime()+3000);
//获取距离当前时间6秒后的时间
Date endDate = new Date();
endDate.setTime(endDate.getTime()+6000);
// 创建一个JobDetail实例,将该实例与HelloJob Class绑定,然后给他创建唯一标识,属于
// 哪个组,再调用build方法将其创建出来
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity("myJob","group1")
.build();
//创建trigger实例
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("myTrigger", "group1")//创建唯一标识,组虽然和jobDetail里的名字相同,但他们不是一回事
.startAt(date)//在date指定的那个时间内开始执行
.endAt(endDate)//在endDATE指定的时间内停止执行
.withSchedule(
SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever()
)//每两秒执行一次,一直执行
.build();
// 创建Scheduler实例
SchedulerFactory sfact = new StdSchedulerFactory();
Scheduler scheduler = sfact.getScheduler();
scheduler.start();
scheduler.scheduleJob(jobDetail, trigger);
}
}
package com.example.demo.quartz;
import java.text.SimpleDateFormat;
import java.util.Calendar;
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.Trigger;
import org.quartz.TriggerKey;
public class HelloJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
// Calendar calendar = Calendar.getInstance();
Date date = new Date();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sf.format(date));
// 编写具体业务
System.out.println("hello xueer");
Trigger trigger = context.getTrigger();
System.out.println("开始时间:"+sf.format(trigger.getStartTime()));
System.out.println("结束时间:"+sf.format(trigger.getEndTime()));
}
}
package com.example.demo.quartz;
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.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
public class HelloScheduler {
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(sf.format(date));
// 创建一个JobDetail实例,将该实例与HelloJob Class绑定,然后给他创建唯一标识,属于
// 哪个组,再调用build方法将其创建出来
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity("myJob","group1")
.build();
//获取距离当前时间4秒后的时间
date.setTime(date.getTime()+4000L);
//4秒后开始执行,且每隔两秒执行一次,第一次执行之后,再重复执行3次
SimpleTrigger trigger = (SimpleTrigger)TriggerBuilder
.newTrigger()
.withIdentity("myTrigger", "group1")//创建唯一标识,组虽然和jobDetail里的名字相同,但他们不是一回事
.startAt(date)
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).withRepeatCount(3))
.build();
/*
//4秒钟之后执行,且仅仅执行一次任务
SimpleTrigger trigger = (SimpleTrigger)TriggerBuilder
.newTrigger()
.withIdentity("myTrigger", "group1")//创建唯一标识,组虽然和jobDetail里的名字相同,但他们不是一回事
.startAt(date)
.build();
*/
// 创建Scheduler实例
SchedulerFactory sfact = new StdSchedulerFactory();
Scheduler scheduler = sfact.getScheduler();
scheduler.start();
scheduler.scheduleJob(jobDetail, trigger);
}
}