2014-05-23 50 views
0

好的,所以在这里我有一个Quartz(2.2.1版本)作业,它应该实例化另外两个作业,为每个作业创建和添加两个触发器,并将两个作业添加到调度器,通过JobDataMap传入的设定时间间隔。石英scheduleJob异常

当此作业调度程序运行时,它抛出以下异常:

org.quartz.JobPersistenceException: The job (DEFAULT.countdown15, countdownGroup) referenced by the trigger does not exist. 

唯一的例外是在71行抛出:

sched.scheduleJob(countdown15Trigger2); 

我无法弄清楚,为什么工作在该点不存在,因为它应该由较早的新的职位调用创建并由行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

我想通过XML文件配置石英工作要简单得多。你的情况有可能吗? – vkg

+0

我不这么认为......这项工作依赖于用户输入,所以它必须以编程方式创建。 – Colin

回答

1

原来这是一个简单的语法错误。除了第一个触发器创建块之外,在forJob方法中,我忽略了将jobKey和jobGroup分隔成两个字符串的中间两个括号。

所以这个:

forJob("countdown60, countdownGroup"); 

本来应该是这样的:

forJob("countdown60", "countdownGroup");