1.JobExecutionContext
当Schuduler调用一个Job时,就会将JobExecutionContext传递给Job的execute()方法,同时Job类可以通过JobExecutionConext对象访问到quartz框架运行的环境以及Job实例本的一些属性参数。
JobExecutionContext接口结构
2.JobDataMap
类结构图
即JobDataMap实现了Map接口,JobDataMap储存在JobExecutionContext中,即使用时通过Job'ExecutionContext获取。主要用途时给Job实例传参。
3.代码实践
MyJob类
import org.quartz.*;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MyJob implements Job {
public void execute(JobExecutionContext context) throws JobExecutionException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
System.out.println("当前时间:"+ simpleDateFormat.format(new Date()));
JobKey jobKey = context.getJobDetail().getKey();
//获取jobDetail的属性值
System.out.println("JobDetailName:" + jobKey.getName() +" JobDetailGroup:" +jobKey.getGroup());
TriggerKey triggerKey = context.getTrigger().getKey();
//获取Trigger的属性值
System.out.println("TriggerName:" + triggerKey.getName() + " TriggerGroup:" + triggerKey.getGroup());
//获取JobDetail通过JobDataMap传递的值
JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
String jobDetailParam = jobDataMap.getString("message");
System.out.println("jobDetailParam:" + jobDetailParam);
//获取Trigger通过JobDataMap传递的值
JobDataMap triggerDateMap = context.getTrigger().getJobDataMap();
String triggerParam = triggerDateMap.getString("message");
System.out.println("tiggerParam:" + triggerParam);
}
}
QuartzTest类
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
public class QuartzTest {
public static void main(String[] args){
try {
//定义一个任务
JobDetail jobDetail = JobBuilder
.newJob(MyJob.class)
.withIdentity("myJobName","myJobGroup")
//通过usingJobData传参给Job
.usingJobData("message","This is a param from JobDetail message!")
.build();
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("myTriggerName","myTriigerGroup")
.withDescription("This is a Trigger !")
.usingJobData("message","This a param from Trigger message!")
.withSchedule(SimpleScheduleBuilder
.simpleSchedule()
//每五秒重复一次
.withIntervalInSeconds(5)
.repeatForever())
.build();
//获取scheduler
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
//将trigger和jobDetail加入到调度
scheduler.scheduleJob(jobDetail,trigger);
//启动调度任务
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
执行结果
4.总结
JobExecutionContext可以获取到JobDetail和Trigger的基本属性值,而通过JobDataMap可以获取额外的在jobDetail和triigger初始化时通过方法usingJobData()传递进来的参数。