来自 jobkey 的 Quartz jobdetail 为空
Quartz jobdetail from jobkey is null
我有以下两种方法,
initialJob();
otherJobs();
其他作业只需在初始作业完成后即可开始。
这是初始作业方法。
private void initialJob(){
JobDetail jobDetail = JobBuilder.newJob(RestTriggerForQuartzJobs.class)
.withIdentity("INITIAL_JOB_NAME", TRIGGER_GROUP)
.usingJobData("PARAM", "")
.build();
Trigger trigger = TriggerBuilder.newTrigger().forJob(jobDetail).startNow().build();
scheduler.scheduleJob(jobDetail, trigger);
}
我在这里检查初始作业是否完成。如果没有,递归调用相同的方法直到完成
private void otherJobs(){
if(isJobComplete("INITIAL_JOB_NAME")){
JobDetail jobDetail = JobBuilder.newJob(RestTriggerForQuartzJobs.class)
.withIdentity("JOB_NAME", TRIGGER_GROUP)
.usingJobData("PARAM", "")
.build();
Trigger trigger = TriggerBuilder.newTrigger().forJob(jobDetail).startNow().build();
scheduler.scheduleJob(jobDetail, trigger);
}else{
otherJobs();
}
}
在 isComplete 方法中,jobDetail jobDetail = scheduler.getJobDetail(jobKey) 的 jobDetail 为空,尽管我可以在石英触发器 table.
中看到 DEFAULT.INITIAL_JOB_NAME
private Boolean isJobComplete(String jobName) throws SchedulerException {
JobKey jobKey = new JobKey(jobName);
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobDetail.getKey());
for (Trigger trigger : triggers) {
TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
if (TriggerState.COMPLETE.equals(triggerState)) {
return true;
}
}
return false;
}
方法 scheduler.getJobDetail(jobKey)
返回 null,因为 JobKey
由名称和组组成以便唯一标识作业。
这意味着您必须使用名称和 组:
启动您的 JobKey
private Boolean isJobComplete(String jobName) throws SchedulerException {
JobKey jobKey = new JobKey(jobName, TRIGGER_GROUP);
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
...
另一个提示:在未定义的时间递归调用方法 otherJobs
可能会导致 WhosebugError
。也许 listeners 对您的用例有用。
我有以下两种方法,
initialJob();
otherJobs();
其他作业只需在初始作业完成后即可开始。
这是初始作业方法。
private void initialJob(){
JobDetail jobDetail = JobBuilder.newJob(RestTriggerForQuartzJobs.class)
.withIdentity("INITIAL_JOB_NAME", TRIGGER_GROUP)
.usingJobData("PARAM", "")
.build();
Trigger trigger = TriggerBuilder.newTrigger().forJob(jobDetail).startNow().build();
scheduler.scheduleJob(jobDetail, trigger);
}
我在这里检查初始作业是否完成。如果没有,递归调用相同的方法直到完成
private void otherJobs(){
if(isJobComplete("INITIAL_JOB_NAME")){
JobDetail jobDetail = JobBuilder.newJob(RestTriggerForQuartzJobs.class)
.withIdentity("JOB_NAME", TRIGGER_GROUP)
.usingJobData("PARAM", "")
.build();
Trigger trigger = TriggerBuilder.newTrigger().forJob(jobDetail).startNow().build();
scheduler.scheduleJob(jobDetail, trigger);
}else{
otherJobs();
}
}
在 isComplete 方法中,jobDetail jobDetail = scheduler.getJobDetail(jobKey) 的 jobDetail 为空,尽管我可以在石英触发器 table.
中看到 DEFAULT.INITIAL_JOB_NAMEprivate Boolean isJobComplete(String jobName) throws SchedulerException {
JobKey jobKey = new JobKey(jobName);
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobDetail.getKey());
for (Trigger trigger : triggers) {
TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
if (TriggerState.COMPLETE.equals(triggerState)) {
return true;
}
}
return false;
}
方法 scheduler.getJobDetail(jobKey)
返回 null,因为 JobKey
由名称和组组成以便唯一标识作业。
这意味着您必须使用名称和 组:
启动您的JobKey
private Boolean isJobComplete(String jobName) throws SchedulerException {
JobKey jobKey = new JobKey(jobName, TRIGGER_GROUP);
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
...
另一个提示:在未定义的时间递归调用方法 otherJobs
可能会导致 WhosebugError
。也许 listeners 对您的用例有用。