2016-05-20 2 views
1

Я новичок в Quartz API и в настоящее время использую кварцевую версию 2.2.x для создания объекта класса планировщика в java для поддержки моего школьного проекта, но столкнулся с исключительным исключением с scheduler.rescheduleJob (trigger.getKey() , cronTrigger); в rescheduleCron функция. Я пытаюсь настроить функцию, чтобы принять выражение cron, чтобы перенести задания кварца и не знаю, что я делаю неправильно. Пожалуйста, помогите мне исправить эту ошибку.NullPointerException с использованием функции переназначения кварца

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

ответ

1

В rescheduleCron(), ваш trigger не был инициализирован. Он установлен в нуль, и когда вы пытаетесь вызвать .getKey() на нем, вы получаете исключение NullPointerException.

Я вижу, что вы делаете ... Я думаю, вы пытаетесь использовать quartzScheduler() в качестве конструктора, поэтому вы ожидаете инициализации trigger. Очень небольшое изменение, чтобы исправить это: удалить возвращаемое значение из этой функции. Конструкторы 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() на внешний класс. Основной() звонок использует класс, он не является его частью
+1

Спасибо! Проверив ваше предложение, я понимаю, что пропустил инициализацию планировщика. scheduler = new StdSchedulerFactory(). GetScheduler(); необходимо добавить перед запуском планировщика. – nubbear

+0

Ницца! рад, что это помогло. Я обновил ответ, чтобы это отразить. –

Смежные вопросы