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