java - Quartz 调度作业异常

标签 java quartz-scheduler job-scheduling

好的,所以这里我有一个 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);

异常(exception):

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);
    }

}

}

最佳答案

事实证明这是一个简单的语法错误。在除了第一个触发器创建 block 之外的所有 block 中,在 forJob 方法中,我省略了中间的两个括号,它们将 jobKey 和 jobGroup 分隔成两个字符串。

所以这个:

forJob("countdown60, countdownGroup");

应该是这样的:

forJob("countdown60", "countdownGroup");

关于java - Quartz 调度作业异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23819768/

相关文章:

grails - 禁用特定服务器的 quartz 作业

java - 如何在作业计划中维护单独的日历假期安排

quartz.net - 如何在 quartz 中排队作业

java - primefaces 与民意调查咆哮

java - 在Java中使用itext将pdf保存到bytearray

java - 数据库表中的 Quartz 作业

mysql - Linux:每天在特定的、不同的预定时间安排命令

Java 防御副本

java - 使用空格将多个参数传递给 ProcessBuilder

java - Grails 错误 - 执行 Bootstrap 时出错 : java. lang.ClassNotFoundException: DefaultQuartzConfig