任务调度执行原理图:
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 {
@Override
public 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);
}
}
方式二
通过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;
}
@Override
public 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一样的话,后者会覆盖前者的值。
关键部分修改: