Java 使用Quartz重新调度程序函数的NullPointerException
我不熟悉Quartz API,目前正在使用Quartz 2.2.x版在java中创建调度器类对象以支持我的学校项目,但在调度器中遇到空指针异常;在重新安排ECRON功能时。我试图设置一个函数来接受cron表达式来重新安排quartz作业,但不知道我做错了什么。请帮我纠正这个错误Java 使用Quartz重新调度程序函数的NullPointerException,java,nullpointerexception,quartz-scheduler,Java,Nullpointerexception,Quartz Scheduler,我不熟悉Quartz API,目前正在使用Quartz 2.2.x版在java中创建调度器类对象以支持我的学校项目,但在调度器中遇到空指针异常;在重新安排ECRON功能时。我试图设置一个函数来接受cron表达式来重新安排quartz作业,但不知道我做错了什么。请帮我纠正这个错误 public class quartzScheduler { public JobDetail job; public Trigger trigger; public Scheduler scheduler; pub
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()
中,您的触发器尚未初始化。它被设置为null,当您尝试调用它时,您会得到一个NullPointerException
我知道你在做什么。。。我认为您试图使用quartzScheduler()作为构造函数,这就是为什么您希望初始化触发器的原因。非常小的改动可以解决这个问题:从该函数中删除返回值。Java构造函数没有返回值
应该是这样的:
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);
}
}
我改变了什么:
- 将您的类名大写(按惯例)
- 从构造函数中删除了返回值和异常
- 已将main()调用移到类外部。main()调用使用该类,它不是该类的一部分
谢谢!在尝试了你的建议之后,我意识到我也错过了初始化调度程序。scheduler=new StdSchedulerFactory().getScheduler();需要在启动调度程序之前添加。很好!很高兴这有帮助。我更新了答案以反映这一点。