2012-02-22 3 views
2

Я использую планировщик Quartz 2.0.1 от StdSchedulerFactory.Нужно ли закрывать планировщик Quartz в блоке finally?

Я ловил SchedulerException в своем коде.

Должен ли я выключить планировщик в блоке, наконец:

} finally { 
    scheduler.shutdown(); 
} 

или я должен сделать отключение в блоке попробовать?

Метод выключения может вызывать SchedulerException, поэтому кажется, что выключение не должно быть в блоке finally.

ответ

0

Вам не нужно делать это в блоке finally в любом случае, потому что если планировщик успешно запущен, он не будет бросать SchedulerException и, следовательно, если вы достигнете блока catch SchedulerException, это означает, что планировщик никогда не был начал. Таким образом, вы не должны останавливать планировщик, который никогда не запускается.

Образец программы из проекта homepage.

public class QuartzTest { 

    public static void main(String[] args) { 

     try { 
      // Grab the Scheduler instance from the Factory 
      Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); 

      // and start it off 
      scheduler.start(); 

      scheduler.shutdown(); 

     } catch (SchedulerException se) { 
      se.printStackTrace(); 
     } 
    } 
} 

Кроме того, из приведенной выше ссылке,

После того, как вы получите планировщик, используя StdSchedulerFactory.getDefaultScheduler(), приложение не будет прекращать, пока вы не вызовете scheduler.shutdown(), потому что там будет активных потоков.

+0

Итак, другими словами, вы почти наверняка позвонит 'scheduler.shutdown()' из где-то в вашем коде, потому что если вы не приложение, вероятно, не остановится. Окончательный блок может быть или не быть подходящим местом, в зависимости от дизайна приложения. Слушателем событий, который запускается при отключении приложения, является еще одно возможное место для размещения 'scheduler.shutdown()'. Не останавливать кварц (например, в веб-приложении) может привести к серьезным утечкам памяти, связанным с загрузкой классов. –

0

Riffing on the above answer, он может по-прежнему сталкиваться с проблемами, если есть другой код, чем запуск/выключение. Например, если у вас есть что-то вроде этого:

public class QuartzTest { 
    public static void main(String[] args) { 

     try { 
      // Grab the Scheduler instance from the Factory 
      Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); 

      // and start it off 
      scheduler.start(); 
      System.out.println(args[5]); 
      scheduler.shutdown(); 

     } catch (SchedulerException se) { 
      se.printStackTrace(); 
     } 
    } 
} 

Приложение никогда не будет вызывать остановку, потому что вы в конечном итоге с ArrayIndexOutOfBoundsException (или что-то в этом роде). Существует довольно много способов решить эту проблему, но это, скорее всего, будет обернуть весь промежуточный код в обработчик исключений и «обработать» что-то там. Например: общественного класса QuartzTest {

public static void main(String[] args) { 

    try { 
     // Grab the Scheduler instance from the Factory 
     Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); 

     // and start it off 
     scheduler.start(); 
     try { 
      System.out.println(args[5]); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     scheduler.shutdown(); 

    } catch (SchedulerException se) { 
     se.printStackTrace(); 
    } 
} 

}