使用 Quartz 重新调度程序函数的 NullPointerException

NullPointerException using Quartz rescheduler function

我是 Quartz 的新手 API,目前正在使用 quartz 版本 2.2.x 在 java 中创建一个调度程序 class 对象来支持我的学校项目但是遇到了scheduler.rescheduleJob(trigger.getKey(), cronTrigger) 的空指针异常;在 rescheduleCron 函数中。我正在尝试设置一个函数来接受 cron 表达式以重新安排石英作业并且不知道我做错了什么。请帮我纠正这个错误。

public class quartzScheduler {

public JobDetail job;
public Trigger trigger;
public Scheduler scheduler;

public void quartzScheduler() throws SchedulerException,InterruptedException
{
    job = JobBuilder.newJob(quartzJob.class)
            .withIdentity("quartzJob", "group1").build();

    trigger = TriggerBuilder
            .newTrigger()
            .withIdentity("quartzTrigger", "group1")
                            .startAt(futureDate(1, IntervalUnit.HOUR))
            .withSchedule(
                    SimpleScheduleBuilder.simpleSchedule()
                            .withIntervalInHours(1).repeatForever())
            .build();

    scheduler.start();
    scheduler.scheduleJob(job, trigger);
}

    public void rescheduleCron(String cronExpression) throws SchedulerException
    {
        Trigger cronTrigger = TriggerBuilder
            .newTrigger()
            .withIdentity("quartzTrigger", "group1")
            .withSchedule(cronSchedule(cronExpression))
            .build();

        scheduler.rescheduleJob(trigger.getKey(), cronTrigger);    
    }


public static void main(String[] args) 
{
    quartzScheduler sch= new quartzScheduler(); 
    try {
        sch.rescheduleCron("0 0 * * * ?");
    } catch (SchedulerException ex) {
        Logger.getLogger(quartzScheduler.class.getName()).log(Level.SEVERE, null, ex);
    }
}

rescheduleCron()中,您的trigger还没有初始化。它设置为 null,当您尝试对其调用 .getKey() 时,您将收到 NullPointerException。

我明白你在做什么...我认为你正在尝试使用 quartzScheduler() 作为构造函数,这就是为什么你期望 trigger 被初始化。解决此问题的非常小的更改:从该函数中删除 return 值。 Java 构造函数没有 return 值。

它应该是这样的:

public class QuartzScheduler {

    public JobDetail job;
    public Trigger trigger;
    public Scheduler scheduler;

    public QuartzScheduler() throws SchedulerException, InterruptedException {
        job = JobBuilder.newJob(quartzJob.class)
                .withIdentity("quartzJob", "group1").build();

        trigger = TriggerBuilder
                .newTrigger()
                .withIdentity("quartzTrigger", "group1")
                .startAt(futureDate(1, IntervalUnit.HOUR))
                .withSchedule(
                    SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInHours(1).repeatForever())
                .build();
        scheduler = new Scheduler(); //maybe do something else here.

        scheduler.start();
        scheduler.scheduleJob(job, trigger);
    }

    public void rescheduleCron(String cronExpression) throws SchedulerException {
        Trigger cronTrigger = TriggerBuilder
            .newTrigger()
            .withIdentity("quartzTrigger", "group1")
            .withSchedule(cronSchedule(cronExpression))
            .build();

        scheduler.rescheduleJob(trigger.getKey(), cronTrigger);    
    }
}

public static void main(String[] args) {
    QuartzScheduler sch= new QuartzScheduler(); 
    try {
        sch.rescheduleCron("0 0 * * * ?");
    } catch (SchedulerException ex) {
        Logger.getLogger(quartzScheduler.class.getName()).log(Level.SEVERE, null, ex);
    }
}

我改变了什么:

  • 将您的 class 姓名大写(按照惯例)
  • 从构造函数中删除了 return 值和异常
  • 将 main() 调用移至 class 之外。 main() 调用 使用 class,它不是它的一部分