该职位被引用

我在成功调度作业时遇到了一些麻烦,但没有得到标题中提到的错误,具体来说: The job (CRAWLS.my_repos) referenced by the trigger does not exist. [See nested exception: org.quartz.JobPersistenceException: The job (CRAWLS.my_repos) referenced by the trigger does not exist.] The job (CRAWLS.my_repos) referenced by the trigger does not exist. [See nested exception: org.quartz.JobPersistenceException: The job (CRAWLS.my_repos) referenced by the trigger does not exist.]

这里看一下代码……其中一切似乎都应该没问题。

runJob方法……需要注意的主要问题是它在这一行中失败了: m_scheduler.scheduleJob(trigger); 该方法的其余部分是存在的,以防其余部分有用。

 public void runJob(JobInfo jobInfo, com.lawson.search.spi.common.Properties jobProperties) { try { JobDataMap jobDataMap = QuartzUtils.createJobDataMapFromLesProperties(jobProperties); if (jobExists(jobInfo)) { m_scheduler.triggerJob(jobKey(jobInfo.getName(), jobInfo.getGroup()), jobDataMap); } else { JobDetail job = QuartzUtils.createJobDetailFromJobInfo(jobInfo); Trigger trigger = newTrigger() .forJob(job) .withIdentity(getImmediateTriggerName(jobInfo)) .build(); m_scheduler.scheduleJob(trigger); } } catch (SchedulerException e) { String msg = "runJob: " + jobInfo; if (s_log.isDebugEnabled()) { s_log.debug(msg, e); } throw new JobSchedulerException(msg, e); } } 

createJobDetailFromJobInfo()方法很简单,但很重要:

 static JobDetail createJobDetailFromJobInfo(JobInfo theJobInfo) { JobDetail detail = newJob(QuartzJobAdapter.class) .withIdentity(theJobInfo.getName(), theJobInfo.getGroup()) .storeDurably() .build(); return detail; } 

我能想到的唯一另一个重要的方法是getImmediateTriggerName()方法,我认为这可能导致问题…但我不知道为什么。

 private String getImmediateTriggerName(JobInfo jobInfo) { return jobInfo.getName() + "#" + jobInfo.getGroup() + ":" + System.currentTimeMillis(); } 

任何帮助,将不胜感激。

尝试安排一份工作

 // Schedule the job with the trigger m_scheduler.scheduleJob(job, trigger); 

代替

 m_scheduler.scheduleJob(trigger); 

来自quartz-scheduler.org :

方法:在2.1.x中安排作业和操作方法:在2.2.x中安排作业

两个版本的代码相同

 // Define job instance JobDetail job1 = newJob(ColorJob.class) .withIdentity("job1", "group1") .build(); // Define a Trigger that will fire "now", and not repeat Trigger trigger = newTrigger() .withIdentity("trigger1", "group1") .startNow() .build(); // Schedule the job with the trigger sched.scheduleJob(job, trigger); 

无论如何,仅当quartz在storeTrigger方法的触发器存储期间无法为触发器的jobkey检索JobDetail抛出exception

 if (retrieveJob(newTrigger.getJobKey()) == null) { throw new JobPersistenceException("The job (" + newTrigger.getJobKey() + ") referenced by the trigger does not exist."); } // add to triggers array triggers.add(tw); 

….

 public JobDetail retrieveJob(JobKey jobKey) { synchronized(lock) { JobWrapper jw = jobsByKey.get(jobKey); return (jw != null) ? (JobDetail)jw.jobDetail.clone() : null; } } 

因此,您的错误非常奇怪,因为之前在forJob类的forJob方法中分配了forJob

 public TriggerBuilder forJob(JobDetail jobDetail) { JobKey k = jobDetail.getKey(); if(k.getName() == null) throw new IllegalArgumentException("The given job has not yet had a name assigned to it."); this.jobKey = k; return this; } 

尝试安排工作

 m_scheduler.scheduleJob(job, trigger); 

首先,如前所述,如果不起作用,您应该调试代码并检查作业键,如果您的键是正确的,可能问题不在您的代码中,并且是石英配置不匹配。

当我收到此错误时,这是​​因为我使用myJobClass.getClass()注册了该作业,但是我在类中包含了一个拦截器,因此类名称不匹配(即运行时类为… $$ EnhancerByGuice $$ 13db15)。 Spring可能会发生类似的事情。