为什么Quartz Scheduler无法正确检查JobDetail的存在?

tec*_*rat 5 java quartz-scheduler

我有以下构建新JobDetail实例的方法;

    private JobDetail getJob(JobID jobID) throws SchedulerException {
        Class<? extends Job> jobClass = jobID.getJobClass();
        if(jobClass != null){
            return JobBuilder
                    .newJob(jobClass)
                    .withIdentity(jobID.jobName(), jobID.jobGroup())
                    .requestRecovery(true)
                    .build();
        }
        return null;
    }
Run Code Online (Sandbox Code Playgroud)

注意:JobID这只是我的帮助程序类,它提供了构建数据库所需的所有必要原始数据JobDetail

然后是另一种进行实际调度的方法;

    doSchedule(Scheduler scheduler, JobDetail job, String triggerName){

        Trigger trigger = buildSomeTrigger(triggerName);

        //check whether job exists in scheduler instance
        if(scheduler.checkExists(job.getKey())){

            //If trigger also exists, then it probably holds new info
            //So, reschedule the existing job with the trigger
            if(scheduler.checkExists(trigger.getKey())){
                System.out.println("update job with Trigger");

                job = job.getJobBuilder().storeDurably(true).build();
                scheduler.addJob(job, true);
                Trigger oldTrigger = scheduler.getTrigger(trigger.getKey());
                scheduler.rescheduleJob(oldTrigger.getKey(), trigger);
            }else{

                //If trigger does not exist, it's an entirely new trigger
                //Add the new trigger to the existing job
                System.out.println("save new trigger for job");

                trigger = trigger.getTriggerBuilder().forJob(job).build();
                scheduler.scheduleJob(trigger);
            }
        }else{

            //If job does not exist, schedule new job with the trigger
            System.out.println("schedule new job with trigger");

            scheduler.scheduleJob(job, trigger);
        }
    }
Run Code Online (Sandbox Code Playgroud)

编辑:这是什么getNewSchedulerInstance()样子;

    private Scheduler getNewSchedulerInstance() {
        Scheduler scheduler = null;
        try {
            scheduler = new StdSchedulerFactory("quartz.properties").getScheduler();
            scheduler.setJobFactory(cdiJobFactory); //<== Utilizes the JobFactory implementation specified in the CdiJobFactory.java class
            scheduler.getListenerManager().addJobListener(new SimpleJobListener());
            scheduler.getListenerManager().addTriggerListener(new SimpleTriggerListener());
        } catch (SchedulerException ex) {
            System.out.println("Scheduler instantiation failed!");
            ex.printStackTrace();
        }
        return scheduler;
    }
Run Code Online (Sandbox Code Playgroud)

最后,用另一种方法,我得到以下内容:

    //This returns a new instance of Scheduler
    Scheduler scheduler = getNewSchedulerInstance();

    if(scheduler != null){
        JobID jobID = new ExtendedJobID(); // <== extends JobID

        JobDetail job = getJob(jobID);
        doSchedule(scheduler, job);
    }
Run Code Online (Sandbox Code Playgroud)

通常我希望能打印出来。

用触发器安排新工作

但是,它正在打印;

保存新的工作触发器

编辑:并因此引发以下异常;

org.quartz.JobPersistenceException: Couldn't store trigger 'GOALS.ACTIVATE_GOALS_0:0' for 'GOALS.ACTIVATE_GOALS' job:
The job (GOALS.ACTIVATE_GOALS) referenced by the trigger does not exist. 
[See nested exception: org.quartz.JobPersistenceException: The job (GOALS.ACTIVATE_GOALS) referenced by the trigger does not exist.]
Run Code Online (Sandbox Code Playgroud)
  • 这表明scheduler.checkExists(job.getKey())回报true
  • scheduler.checkExists(trigger.getKey()) 退货 false
  • 但是例外说 The job (*jobName*) referenced by the (*trigger*) does not exist

因此,这使我感到困惑,因为似乎scheduler.checkExists(...)无法正确地检查作业是否存在于调度程序中

如果检查执行了我期望的操作,则甚至不应抛出该异常;

但是正如您所看到的,JobDetail是新构建的,并且之前从未以任何方式与调度程序相关联...

  • 所以我想知道我是否缺少一些Quartz Scheduler点?

  • 如果是这样,有人可以在这里解释我可能做错了吗?...

  • 还是这可能是一个错误?

  • 有什么解决方法吗?