【问题标题】:Quartz jobdetail from jobkey is null来自 jobkey 的 Quartz jobdetail 为空
【发布时间】:2018-01-22 23:16:40
【问题描述】:

我有以下两种方法,

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 为 null,尽管我可以在石英触发器表中看到 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;
    }

【问题讨论】:

  • isComplete 方法在哪里?

标签: java quartz-scheduler


【解决方案1】:

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 一个未定义的时间可能会导致一个StackOverflowError。也许listeners 对您的用例有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    相关资源
    最近更新 更多