JobExecutionContext是什么?
- 当Scheduler调用一个Job,就会将JobExecutionContext传递给Job的 execute() 方法;
- Job能通过JobExecutionContext对象访问到Quartz运行时候的环境以及Job本身的明细数据。
JobDataMap是什么?
- 在进行任务调度时JobDataMap存储在JobExecutionContext中,非常方便获取
- JobDataMap可以用来装载任何可以序列化的数据对象,当Job实例对象被执行时,这些参数对象会传递给它。
- JobDataMap实现了JDK的Map 接口,并且添加了一些非常方便的方法用来存储基本数据类型。
JobDataMap的获取方式
- 方式一:从Map里面直接获取
import java.text.NumberFormat; import java.text.SimpleDateFormat; 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{ public void execute(JobExecutionContext context) throws JobExecutionException { //打印当前的执行时间 Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String currentTime = sdf.format(date); System.out.println("Current Exec Time : "+currentTime); //编写具体的业务逻辑 JobKey key = context.getJobDetail().getKey(); System.out.println("my name is :"+key.getName()+" and group is:" +key.getGroup());
TriggerKey trkey = context.getTrigger().getKey(); System.out.println("my name is: "+trkey.getName()+" and group is:"+trkey.getGroup());
JobDataMap dataMap = context.getJobDetail().getJobDataMap(); JobDataMap tdataMap = context.getTrigger().getJobDataMap();
String jobMessage = dataMap.getString("message"); Float FloatJobValue = dataMap.getFloat("FloatJobValue"); String triggerMessage = tdataMap.getString("message"); Double DoubleTriggerValue = tdataMap.getDouble("DoubleTriggerValue");
System.out.println(jobMessage); System.out.println(FloatJobValue); System.out.println(triggerMessage); System.out.println(DoubleTriggerValue); } }
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 jobDetail = JobBuilder.newJob(HelloJob.class) .withIdentity("myJob", "group1") .usingJobData("message", "hello myJob1") .usingJobData("FloatJobValue", 3.14f).build(); //创建一个Trigger实例,定义该Job立即执行,并且每隔2秒钟重复执行一次,直到永远 Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("myTrigger", "group1") .usingJobData("message", "hello myTrigger1") .usingJobData("DoubleTriggerValue", 2.0D) .startNow(). withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever()) .build(); //创建Scheduler实例 SchedulerFactory sfact = new StdSchedulerFactory(); Scheduler scheduler = sfact.getScheduler(); scheduler.start(); scheduler.scheduleJob(jobDetail, trigger); } }
import java.text.NumberFormat; import java.text.SimpleDateFormat; 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{ public void execute(JobExecutionContext context) throws JobExecutionException { //打印当前的执行时间 Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String currentTime = sdf.format(date); System.out.println("Current Exec Time : "+currentTime); //编写具体的业务逻辑 JobKey key = context.getJobDetail().getKey(); System.out.println("my name is :"+key.getName()+" and group is:" +key.getGroup()); TriggerKey trkey = context.getTrigger().getKey(); System.out.println("my name is: "+trkey.getName()+" and group is:"+trkey.getGroup()); JobDataMap dataMap = context.getMergedJobDataMap(); String jobMessage = dataMap.getString("message"); Float FloatJobValue = dataMap.getFloat("FloatJobValue"); String triggerMessage = dataMap.getString("message"); Double DoubleTriggerValue = dataMap.getDouble("DoubleTriggerValue"); System.out.println(jobMessage); System.out.println(FloatJobValue); System.out.println(triggerMessage); System.out.println(DoubleTriggerValue); } }
方式二:Job实现类中添加setter方法对应JobDataMap的键值(Quartz框架默认的JobFactory 实现类在初始化job实例对象时会自动地调用这些setter方法)
package com.test.quartz.myquartz; import java.text.SimpleDateFormat; 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 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 context) throws JobExecutionException { //打印当前的执行时间 Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String currentTime = sdf.format(date); System.out.println("Current Exec Time : "+currentTime); //编写具体的业务逻辑 JobKey key = context.getJobDetail().getKey(); System.out.println("my name is :"+key.getName()+" and group is:" +key.getGroup()); TriggerKey trkey = context.getTrigger().getKey(); System.out.println("my name is: "+trkey.getName()+" and group is:"+trkey.getGroup()); System.out.println("message is :" +message); System.out.println("FloatJobValue is :" +FloatJobValue); System.out.println("DoubleTriggerValue is :" +DoubleTriggerValue); } }