任务调度执行原理图:
JobDataMap的使用
JobDataMap是Quartz调度器中的一个重要组件,主要用于存储和传递与作业(Job)相关的数据。它是一个实现了Java Map接口的对象,可以用来保存一系列的序列化的对象。这些对象在作业执行时可以被获取并使用。
JobDataMap的主要特点包括:
- 它可以存储任何可以序列化的数据对象。这意味着你可以将任何类型的对象(只要它们可以被序列化)放入JobDataMap中,并在作业执行时获取这些对象。
- JobDataMap实现了JDK的Map接口,并添加了一些便捷的方法来存取基本数据类型。这使得操作数据变得更加方便和高效。
- 当使用持久化的JobStore时,需要注意存放在JobDataMap中的内容。因为放入JobDataMap中的内容将被序列化,有时可能会出现类型转换问题。标准Java类型通常很安全,但对于其他类型,如果在序列化过程中改变了类的定义,可能会导致兼容性问题。
- JobDataMap可以与触发器(Trigger)相关联。对于每次独立的触发,可以为作业提供不同的输入数据。
在创建和配置调度器时,可以使用JobDataMap来传递参数给作业。有两种方式可以从执行方法的上下文中取出参数:一种是直接从execute方法的上下文中取出,另一种是在作业类中定义参数名称,并完成相应的get和set方法。
任务详情类和触发器类都可以在创建实例的时候设置JobDataMap
方式一
通过其中的usingDataJob()方法设置值,通过JobExecutionContext全局变量获取值
package schedule;import job.MyJob;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;public class MySchedule1 {public static void main(String[] args) {// 创建作业详情JobDetail jobDetail = JobBuilder.newJob(MyJob.class)//作业的类名.withIdentity("myJob", "group1")//作业的身份标识(名称和组名).usingJobData("jobDetail","jobDetail").build();//创建触发器Trigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1")//触发器的身份标识(名称和组名).usingJobData("trigger","trigger").withSchedule(SimpleScheduleBuilder.simpleSchedule()//设置触发器的调度计划.withIntervalInSeconds(3)//设置作业执行的间隔时间为3秒。.repeatForever())//指定触发器应该无限次地重复执行作业。.build();try {// 创建调度器实例Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();// 将作业和触发器注册到调度器scheduler.scheduleJob(jobDetail, trigger);// 开始调度scheduler.start();} catch (SchedulerException se) {se.printStackTrace();}}
}
package job;import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;public class MyJob implements Job {@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {//获取jobDetail中的JobDataString jobDetail = jobExecutionContext.getJobDetail().getJobDataMap().getString("jobDetail");//获取trigger中的JobDataString trigger = jobExecutionContext.getTrigger().getJobDataMap().getString("trigger");System.out.println(jobDetail);System.out.println(trigger);}
}
方式二
通过Job子类的set方法将属性赋值,在添加jobdata时将key值设为set方法中设置的属性名
实例
关键修改部分代码
package job;import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;public class MyJob1 implements Job {private String jobDetail;private String trigger;public void setJobDetail(String jobDetail) {this.jobDetail = jobDetail;}public void setTrigger(String trigger) {this.trigger = trigger;}@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {// //获取jobDetail中的JobData
// String jobDetail = jobExecutionContext.getJobDetail().getJobDataMap().getString("jobDetail");
// //获取trigger中的JobData
// String trigger = jobExecutionContext.getTrigger().getJobDataMap().getString("trigger");System.out.println(jobDetail);System.out.println(trigger);}
}
注意事项
当任务详细类中的JobDataMap设置的key和调度器类设置的key一样的话,后者会覆盖前者的值。
关键部分修改: