好的,所以我在这里得到了一个Quartz(2.2.1版)作业,该作业应该实例化另外两个作业,为每个作业创建并添加两个触发器,并将两个作业添加到调度程序中,在之后删除它们设置通过JobDataMap传入的间隔。
当调度程序运行此作业时,它会抛出以下异常:
org.quartz.JobPersistenceException: The job (DEFAULT.countdown15, countdownGroup) referenced by the trigger does not exist.
在第71行抛出异常:
sched.scheduleJob(countdown15Trigger2);
我无法弄清楚为什么这个工作在那时不存在,因为它应该是由早期的newJob调用创建的,并且由第70行添加到调度程序中:
sched.scheduleJob(countdown15, countdown15Trigger1);
所以,我暂时注释掉那一行并试图再次运行程序,于是我在第72行得到了这个例外:
第72行:
sched.scheduleJob(countdown60, countdown60Trigger1);
异常:
org.quartz.SchedulerException: Trigger does not reference given job!
好的,所以现在我有两个scheduleJob调用抛出两个不同的异常,尽管我可以告诉我按照正确的语法。但是第一个scheduleJob调用必须正常工作,因为异常发生在代码的后面,所以现在我将注释掉所有其他scheduleJob调用,看看会发生什么。
然后我在第70行得到了这个错误,第一个也是现在只有scheduleJob调用:
org.quartz.ObjectAlreadyExistsException: Unable to store Job : 'countdownGroup.countdown15', because one already exists with this identification.
我真的不知道从哪里开始,所以这里是顶级工作的完整代码。有什么想法吗?
public class ShowClockJob implements Job {
public ShowClockJob() {}
@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
JobDataMap dm = context.getJobDetail().getJobDataMap();
int min = dm.getInt("min"); //show's runtime in minutes
int ms = min * 60000; //convert the runtime in minutes to millisec
Scheduler sched = context.getScheduler();
JobDetail countdown15 = newJob(CountdownJob15.class)
.withIdentity(jobKey("countdown15", "countdownGroup"))
.build();
JobDetail countdown60 = newJob(CountdownJob60.class)
.withIdentity("countdown60", "countdownGroup")
.build();
Trigger countdown15Trigger1 = newTrigger()
.withIdentity("countdown15Trigger1", "countdownGroup")
.withSchedule(cronSchedule("45 5 * * * ?")
.withMisfireHandlingInstructionDoNothing())
.forJob(jobKey("countdown15", "countdownGroup"))
.build();
Trigger countdown15Trigger2 = newTrigger()
.withIdentity("countdown15Trigger2", "countdownGroup")
.withSchedule(cronSchedule("55 19,32,46 * * * ?")
.withMisfireHandlingInstructionDoNothing())
.forJob(jobKey("countdown15, countdownGroup"))
.build();
Trigger countdown60Trigger1 = newTrigger()
.withIdentity("countdown60Trigger1", "countdownGroup")
.withSchedule(cronSchedule("0 17,29,44 * * * ?")
.withMisfireHandlingInstructionDoNothing())
.forJob(jobKey("countdown60, countdownGroup"))
.build();
Trigger countdown60Trigger2 = newTrigger()
.withIdentity("countdown60Trigger2", "countdownGroup")
.withSchedule(cronSchedule("50 57 * * * ?")
.withMisfireHandlingInstructionDoNothing())
.forJob("countdown60, countdownGroup")
.build();
try {
sched.scheduleJob(countdown15, countdown15Trigger1);
sched.scheduleJob(countdown15Trigger2);
sched.scheduleJob(countdown60, countdown60Trigger1);
sched.scheduleJob(countdown60Trigger2);
Thread.sleep(ms); //sleep for the length of the showtime,
//...then shut down the countdown jobs
sched.deleteJob(jobKey("countdown15","countdownGroup"));
sched.deleteJob(jobKey("countdown60","countdownGroup"));
} catch (SchedulerException | InterruptedException ex) {
Logger.getLogger(ShowClockJob.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
答案 0 :(得分:1)
原来这是一个简单的语法错误。在除了第一个触发器创建块之外的所有块中,在forJob方法中,我省略了将jobKey和jobGroup分成两个字符串的中间两个括号。
所以这个:
forJob("countdown60, countdownGroup");
应该是这样的:
forJob("countdown60", "countdownGroup");