在 Quartz 中,你可以通过作业(Job)的上下文来传递和访问定时任务的参数信息。Quartz 提供了多种方式来设置和获取这些参数,这通常涉及到 JobDataMap,它允许你向 Job 传递数据。
设置参数
当你调度一个 Job 时,可以使用 JobDetail 或者 Trigger 来添加参数。以下是两种常见的方式:
使用 JobDetail 设置参数
JobDetail job = JobBuilder.newJob(MyJob.class)
.withIdentity("job1", "group1")
.usingJobData("jobSays", "Hello World!")
.usingJobData("myFloatValue", 3.141f)
.build();
或者使用 Trigger 设置参数
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1")
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(40)
.repeatForever())
.usingJobData("triggerKey", "triggerValue")
.build();
参考设置:
protected void scheduleJob(QuartzEntity quartzEntity){
Long tenantId = quartzEntity.getTenantId();
String classname = quartzEntity.getClassname();
String jobName = quartzEntity.getName();
String group = quartzEntity.getGroup();
String descr = quartzEntity.getDescr();
String cronexpre = quartzEntity.getCronexpre();
String identityJob = jobName+tenantId;
try {
Class cls = Class.forName(classname);
cls.newInstance();
//构建job信息
JobDetail job = JobBuilder.newJob(cls)
.withIdentity(identityJob,group)
.withDescription(descr)
.usingJobData("tenantId", tenantId)
.build();
// 触发时间点
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronexpre);
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger" + identityJob,group)
.startNow()
.withSchedule(cronScheduleBuilder)
.build();
//交由Scheduler安排触发
scheduler.scheduleJob(job, trigger);
log.info("任务开启:{}-{}", group, identityJob);
if("0".equals(quartzEntity.getTristate())){
JobKey key = getJobKey(quartzEntity);
scheduler.pauseJob(key);
log.info("任务暂停:{}-{}", group, identityJob);
}
}catch (Exception e){
log.error("任务触发失败:{}-{}", group, identityJob);
}
}
获取参数
在你的 Job 实现中,可以通过 JobExecutionContext 访问这些参数。以下是一个示例:
public class MyJob implements Job {
public void execute(JobExecutionContext context) throws JobExecutionException {
JobKey key = context.getJobDetail().getKey();
// 获取 JobDetail 中的参数
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
String jobSays = dataMap.getString("jobSays");
float myFloatValue = dataMap.getFloat("myFloatValue");
// 获取 Trigger 中的参数
JobDataMap triggerDataMap = context.getTrigger().getJobDataMap();
String triggerKey = triggerDataMap.getString("triggerKey");
// 合并后的 JobDataMap,优先级:触发器 > 作业详情
JobDataMap mergedDataMap = context.getMergedJobDataMap();
String mergedValue = mergedDataMap.getString("jobSays"); // 可能来自 JobDetail 或 Trigger
System.out.println("Instance " + key + " of DumbJob says: " + jobSays + ", and val is: " + myFloatValue);
}
}
注意事项
- 当同时在 JobDetail 和 Trigger 中设置了相同的键值对时,Trigger 中的数据会覆盖 JobDetail 中的数据。
- 使用 context.getMergedJobDataMap() 可以获得合并后的 JobDataMap,其中包含了从 JobDetail 和 Trigger 中的所有数据,并且如果有重复键的话,Trigger 的值会覆盖 JobDetail 的值。