Quartz - как выключить и перезапустить планировщик?

Я получаю планировщик следующим образом:

StdScheduler schedulerBean = (StdScheduler) ApplicationContextUtil.getBean(schedulerBeanName);
schedulerBean.start();

и позже

schedulerBean.shutdown();

после выполнения нескольких других кодов я вызываю schedulerBean.начать снова.

теперь код выдает ошибку - " org.кварцевый.SchedulerException: планировщик не может быть перезапущен после shutdown () был вызван"

не могли бы вы сообщить мне, как решить проблему?

спасибо заранее, Катир!--3-->

1 ответов


после завершения работы планировщика, он не может быть перезапущен, как потоки и другие ресурсы постоянно будут разрушены.

вы можете прочитать ссылки API планировщика кварца для того, чтобы найти способ, который покрывает ваши потребности. Ниже вы можете найти некоторые доступные методы.

  • standby() метод. Временно останавливает запуск триггеров планировщиком. Когда вызывается start () (чтобы вывести планировщик из режима ожидания), вызовите осечку инструкции не будут применяться во время выполнения метода start () - любые осечки будут обнаружены сразу после этого (обычным процессом JobStore).
  • pauseJob(JobKey jobKey) -resumeJob(JobKey jobKey). Приостановите JobDetail с помощью данного ключа, приостановив все его текущие триггеры. При resumeJob (JobKey jobKey), если какой-либо из опознавателей задания пропустил один или несколько раз, то будет применена инструкция осечки триггера.
  • interrupt(JobKey jobKey). Запрос на прерывание в этом Экземпляр планировщика всех выполняемых в данный момент экземпляров указанного задания, который должен быть исполнителем интерфейса InterruptableJob. Если в данный момент выполняется несколько экземпляров указанного задания, то для каждого экземпляра будет вызываться метод InterruptableJob#interrupt (). Однако существует ограничение, что в случае, если interrupt() на одном экземпляре создает исключение, все остальные экземпляры (которые еще не были прерваны) не будут иметь свой метод interrupt() называемый. Если вы хотите прервать конкретный экземпляр задания (когда выполняется более одного), вы можете сделать это, вызвав getCurrentlyExecutingJobs (), чтобы получить дескриптор экземпляра задания, а затем вызвать interrupt() на нем самостоятельно. Этот метод не является кластерным. То есть он будет прерывать только экземпляры определенного прерываемого задания, выполняемого в данный момент в этом экземпляре планировщика, а не во всем кластере.
  • unscheduleJob(TriggerKey triggerKey). Снимите указанный триггер с планировщик. Если связанное задание не имеет других триггеров и задание не является долговечным, то задание также будет удалено.

обратите внимание, что вы можете создать прослушиватель, который реализует интерфейс ServletContextListener так что:

  • все задания прерываются, и планировщик завершает работу, когда контейнер завершает работу
  • планировщик создан, и задания запланированы, когда контейнер started

если вы хотите создать такого слушателя, я мог бы предоставить более подробную информацию.

надеюсь, это поможет.