一 点睛
1 JobExecutionContext是什么
-
当Scheduler调用一个Job,就会将JobExecutionContext传递给Job的execute()方法
-
Job能通过JobExecutionContext对象访问到Quartz运行时候的环境以及Job对象的明细数据。
2 JobDataMap是什么
-
在进行任务调度时JobDataMap存储在JobExecutionContext中,非常方便获取。
-
JobDataMap可以用来装载任务可序列化的数据对象,当job实例对象被执行时这些参数对象会传递给它。
-
JobDataMap实现了JDK的Map接口,并且添加了一些非常方便的方法用来存取基本数据类型。
3 获取JobDataMap的两种方法
-
从Map中直接获取
-
Job实现类中添加setter方法对应JobDataMap的键值(Quartz框架默认的JobFactory实现类在初始化job实例对象时会自动调用这些setter方法)
二 实战——从Map中直接获取
1 启动类
package com.quartz;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import java.text.SimpleDateFormat;
import java.util.Date;
public class HelloScheduler {
public static void main(String[] args) throws SchedulerException {
//创建一个JobDetail实例, 将该实例与hellojob class 绑定
JobDetail jobDetail = JobBuilder.newJob(HelloJob.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.0D) //演示传递参数
.startNow().withSchedule(
SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(2).repeatForever()
).build();
//创建Schedule实例
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.start();
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("Current Time is:" + simpleDateFormat.format(date));
scheduler.scheduleJob(jobDetail,trigger);
}
}
2 Job类
package com.quartz;
import org.quartz.*;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Created by kenfo on 2017/10/16.
*/
public class HelloJob implements Job{
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//打印当前执行的时间
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("+++++++++++++++++++++++++++");
System.out.println("Current Exec Time is:" + simpleDateFormat.format(date));
//演示通过jobExecutionContext传递参数
JobKey key = jobExecutionContext.getJobDetail().getKey();
System.out.println("My name and group are:"+key.getName()+":"+key.getGroup());
TriggerKey trkey = jobExecutionContext.getTrigger().getKey();
System.out.println("My trigger name and group are:"+key.getName()+":"+key.getGroup());
JobDataMap dataMap=jobExecutionContext.getJobDetail().getJobDataMap();
JobDataMap triDataMap=jobExecutionContext.getTrigger().getJobDataMap();
String jobMsg = dataMap.getString("message");
Float jobFloatValue=dataMap.getFloat("FloatJobValue");
String triMsg =triDataMap.getString("message");
Double triDoubleValue=triDataMap.getDouble("DoubleTriggerValue");
System.out.println("jobMsg"+jobMsg);
System.out.println("jobFloatValue"+jobFloatValue);
System.out.println("triMsg"+triMsg);
System.out.println("triDoubleValue"+triDoubleValue);
}
}
3 测试结果
+++++++++++++++++++++++++++
Current Exec Time is:2018-11-16 19:50:58
My name and group are:myJob:DEFAULT
My trigger name and group are:myJob:DEFAULT
jobMsgHello myjob1
jobFloatValue3.14
triMsghello myTrigger1
triDoubleValue2.0
+++++++++++++++++++++++++++
Current Exec Time is:2018-11-16 19:51:00
My name and group are:myJob:DEFAULT
My trigger name and group are:myJob:DEFAULT
jobMsgHello myjob1
jobFloatValue3.14
triMsghello myTrigger1
triDoubleValue2.0
三 实战——演示getMergedJobDataMap方法
1 Job类
package com.quartz;
import org.quartz.*;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Created by kenfo on 2017/10/16.
*/
public class HelloJob implements Job{
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//打印当前执行的时间
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("+++++++++++++++++++++++++++");
System.out.println("Current Exec Time is:" + simpleDateFormat.format(date));
//演示通过jobExecutionContext传递参数
JobKey key = jobExecutionContext.getJobDetail().getKey();
System.out.println("My name and group are:"+key.getName()+":"+key.getGroup());
TriggerKey trkey = jobExecutionContext.getTrigger().getKey();
System.out.println("My trigger name and group are:"+key.getName()+":"+key.getGroup());
//演示getMergedJobDataMap方法,Trigger的key优先级别高于jobDetail
JobDataMap dataMap=jobExecutionContext.getMergedJobDataMap();
String Msg = dataMap.getString("message");
Float jobFloatValue=dataMap.getFloat("FloatJobValue");
Double triDoubleValue=dataMap.getDouble("DoubleTriggerValue");
System.out.println("Msg is "+Msg); //Trigger中的msg会覆盖掉jobDetail中msg
System.out.println("jobFloatValue:"+jobFloatValue);
System.out.println("triDoubleValue:"+triDoubleValue);
}
}
2 测试结果
Current Time is:2018-11-16 21:51:24
+++++++++++++++++++++++++++
Current Exec Time is:2018-11-16 21:51:24
My name and group are:myJob:DEFAULT
My trigger name and group are:myJob:DEFAULT
Msg is hello myTrigger1
jobFloatValue:3.14
triDoubleValue:2.0
+++++++++++++++++++++++++++
Current Exec Time is:2018-11-16 21:51:26
My name and group are:myJob:DEFAULT
My trigger name and group are:myJob:DEFAULT
Msg is hello myTrigger1
jobFloatValue:3.14
triDoubleValue:2.0
四 实战——演示第二种方法setter获得JobDataMap
1 Job类
package com.quartz;
import org.quartz.*;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Created by kenfo on 2017/10/16.
*/
public class HelloJob implements Job{
//通过setter方法获得datamap的值,跟传入参数的key相同
private String message;
private Float FloatJobValue;
private Double DoubleTriggerValue;
public void setMessage( String message ) {
this.message = message;
}
public void setFloatJobValue( Float floatJobValue ) {
FloatJobValue = floatJobValue;
}
public void setDoubleTriggerValue( Double doubleTriggerValue ) {
DoubleTriggerValue = doubleTriggerValue;
}
public void execute( JobExecutionContext jobExecutionContext) throws JobExecutionException {
//打印当前执行的时间
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("+++++++++++++++++++++++++++");
System.out.println("Current Exec Time is:" + simpleDateFormat.format(date));
//演示通过jobExecutionContext传递参数
JobKey key = jobExecutionContext.getJobDetail().getKey();
System.out.println("My name and group are:"+key.getName()+":"+key.getGroup());
TriggerKey trkey = jobExecutionContext.getTrigger().getKey();
System.out.println("My trigger name and group are:"+key.getName()+":"+key.getGroup());
System.out.println("Msg is "+message); //Trigger中的msg会覆盖掉jobDetail中msg
System.out.println("jobFloatValue:"+FloatJobValue);
System.out.println("triDoubleValue:"+DoubleTriggerValue);
}
}
2 测试结果
Current Time is:2018-11-16 21:47:39
+++++++++++++++++++++++++++
Current Exec Time is:2018-11-16 21:47:39
My name and group are:myJob:DEFAULT
My trigger name and group are:myJob:DEFAULT
Msg is hello myTrigger1
jobFloatValue:3.14
triDoubleValue:2.0
+++++++++++++++++++++++++++
Current Exec Time is:2018-11-16 21:47:41
My name and group are:myJob:DEFAULT
My trigger name and group are:myJob:DEFAULT
Msg is hello myTrigger1
jobFloatValue:3.14
triDoubleValue:2.0