作用
quartz的job是无状态的,每次调度都会实例化一个新的job实例,如果要在记录job的状态,保留上一次调度的结果,就需要用jobdatamap。
使用方法
jobDataMap可以跟jobDetail绑定,也可以跟Trigger绑定
JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
.withIdentity("job1", "group1")
.usingJobData("data", "jobDetail")
.usingJobData("name", "jobDetail1")
.build();
Trigger trigger= TriggerBuilder.newTrigger()
.withIdentity("trigger1","group1")
.usingJobData("data","trigger")
.usingJobData("name","trigger1")
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever())
.build();
在Job中可以通过JobDetail和Trigger获取到对应的JobDataMap
String data = context.getJobDetail().getJobDataMap().getString("data");
System.out.println(data);
String data1 = context.getTrigger().getJobDataMap().getString("data");
System.out.println(data1);
也可以通过Job中的成员变量来获取,这是因为每次调度时,实例化生成Job实例后,还会调用set方法给JobDataMap中key的同名属性赋值。
public class MyJob implements Job {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println(name);
}
}
getMergeDataMap获取合并的值,Trigger会覆盖JobDetail中key重名的
String data2 = context.getMergedJobDataMap().getString("data");
最佳实践
- JobDataMap最好只存基本类型和String,因为如果要用数据库持久化Job,用其他类型容易产生序列化问题
- 使用getMergeDataMap