更好的阅读体验:点这里 ( www.foooor.com
)
3 传递参数
如果我们想在创建任务和触发器的时候,给任务传递一些参数,在执行任务的时候,可以读取到这些参数,那么该如何处理呢?
这里就需要用到 JobDataMap
。
3.1 传递参数
我们可以在创建 Job 或 Trigger 的时候,设置参数。
举个栗子:
// 1.定义jobDetail
JobDetail job = JobBuilder.newJob(MyJob.class)
.withIdentity("job1", "jGroup1")
.usingJobData("name", "Doubibiji") // 通过key-value形式设置参数
.usingJobData("description", "job的参数") // 通过key-value形式设置参数
.build();
// 2.定义触发器
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "tGroup1")
.usingJobData("year", 2024) // 通过key-value形式设置参数
.usingJobData("description", "trigger的参数") // 通过key-value形式设置参数
// 立刻执行
.startNow()
// 触发策略,用简单的触发策略,就是按照时间间隔执行
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
// 5秒执行一次
.withIntervalInSeconds(1)
// 一直重复
.repeatForever())
.build();
在创建 Job 或 Trigger 的时候,都可以通过 JobDataMap 以 key-value 的形式设置参数,这是因为 JobDataMap 实现了 JDK 中的 Map 接口。
下面就可以来获取上面传递的参数了。
3.1 接收参数
接收参数有两种方式,一种是在 Job 中获取到 JobDataMap 对象,通过 JobDataMap 获取参数。一种是通过 Job 中的属性来接收参数。
1 通过 JobDataMap 获取参数
在 Job 类中的 execute
方法中,通过 JobExecutionContext 对象可以获取到 JobDetail 和 Trigger,然后获取到 JobDataMap。
package com.doubibiji.job;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("--------");
// 获取job传递的数据
JobDataMap jobMap = jobExecutionContext.getJobDetail().getJobDataMap();
System.out.println("name:" + jobMap.getString("name"));
System.out.println("description:" + jobMap.getString("description"));
// 获取trigger传递的数据
JobDataMap triggerMap = jobExecutionContext.getTrigger().getJobDataMap();
System.out.println("year:" + triggerMap.getInt("year"));
System.out.println("description:" + triggerMap.getString("description"));
// 也可以将job和trigger传递的参数合并后进行获取
JobDataMap mergedMap = jobExecutionContext.getMergedJobDataMap();
System.out.println("name:" + mergedMap.getString("name"));
System.out.println("year:" + mergedMap.getInt("year"));
System.out.println("description:" + mergedMap.getString("description"));
}
}
JobExecutionContext 对象是任务执行的上下文对象,可以获取到全局的信息。可以通过 JobExecutionContext 对象获取到 JobDetail 和 Trigger 的信息,然后获取到 JobDataMap 的信息。
通过 getMergedJobDataMap()
可以获取 JobDetail 和 Trigger 传递的参数合并后的结果,如果传递参数的时候 JobDetail 和 Trigger 传递了相同的 key 值,那么 Trigger 中传递的参数会覆盖 JobDetail 中的参数。
执行结果:
可以看到合并后的信息,打印的 description 是 Trigger 传递的。
2 通过属性获取参数
首先在 Job 中定义与传递数据的时候 key 相同属性和 set 方法。
这样在创建 job 的时候,会通过 setter 将参数设置进来。
package com.doubibiji.job;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class MyJob implements Job {
// 需要与传递的key名称相同
private String name;
private int year;
private String description;
// 定义set方法
public void setName(String name) {
this.name = name;
}
public void setYear(int year) {
this.year = year;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("--------");
// 获取到传递的数据
System.out.println("name:" + name);
System.out.println("year:" + year);
System.out.println("description:" + description);
}
}
这样看上去代码要简洁很多。
执行结果: