Нужно ли выключить планировщик Quartz в блоке finally? - PullRequest
2 голосов
/ 22 февраля 2012

Я использую планировщик Quartz 2.0.1 из StdSchedulerFactory.

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

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

} finally {
    scheduler.shutdown();
}

или я должен выполнить выключение в блоке try?

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

Ответы [ 2 ]

0 голосов
/ 22 февраля 2012

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

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

}

0 голосов
/ 22 февраля 2012

В любом случае вам не нужно делать это в блоке finally, потому что, если планировщик запущен успешно, он не выдаст SchedulerException, и, следовательно, если вы достигнете блока перехвата 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 (), потому что будут активные потоки.

...