为什么Quartz Scheduler没有正确检查JobDetail的存在?

时间:2016-07-26 12:35:33

标签: 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;
    }

注意: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);
        }
    }

编辑:以下是 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;
    }

然后最后在另一种方法中,我有以下内容;

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

通常我希望打印出来;

  

使用触发器安排新作业

但是它正在打印;

  

保存作业的新触发器

编辑:因此抛出以下异常;

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.]
  • 这表明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积分?...

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

  • 或者这实际上可能是一个错误?...

  • 有没有解决方法?

0 个答案:

没有答案