使用 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,它不是它的一部分
我是 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,它不是它的一部分