2013-02-22 907 views
6

我收到调度如下:Quartz - 如何关闭并重新启动调度程序?

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

后来

schedulerBean.shutdown(); 
执行一些其他的代码后

,那么我()再次调用schedulerBean.start。

现在的代码抛出的错误 - “org.quartz.SchedulerException:调度程序不能关机之后重新启动()被称为”

可否请你让我知道如何解决这个问题呢?

由于提前, 本Kathir

回答

7

一旦你关闭一调度,它不能被重新启动线程和其他资源的永久破坏。

您可以阅读Quartz Scheduler API references以找到满足您需求的方法。在下面你可以找到一些可用的方法。

  • standby()方法。暂时停止调度程序触发触发器。当调用start()(使调度器退出待机模式)时,在执行start()方法期间不会触发失火指令 - 之后会立即检测到任何失火(通过JobStore的正常过程) 。
  • pauseJob(JobKey jobKey) - resumeJob(JobKey jobKey)。用给定的键暂停JobDetail - 暂停所有当前的触发器。在resumeJob(JobKey jobKey)上,如果Job的任何触发器错过了一个或多个触发时间,那么触发器的失火指令将被应用。
  • interrupt(JobKey jobKey)。请求在此调度程序实例内中断所标识的作业的所有当前正在执行的实例,该实例必须是InterruptableJob接口的实现者。如果当前执行的标识作业有多个实例,则将在每个实例上调用InterruptableJob#interrupt()方法。但是,如果一个实例的interrupt()引发异常,则所有剩余的实例(尚未中断)都不会调用其interrupt()方法,这是有限制的。如果您希望中断某个作业的特定实例(当执行多个作业时),可以通过调用getCurrentlyExecutingJobs()来获取作业实例的句柄,然后自行调用interrupt()来完成。此方法不支持群集。也就是说,它只会中断当前在此计划程序实例中执行的InterruptableJob的实例,而不会跨整个群集。
  • unscheduleJob(TriggerKey triggerKey)。从调度程序中删除指示的触发器。如果相关作业没有任何其他触发器,且作业不耐用,则作业也将被删除。

注意,您可以创建一个实现了ServletContextListener接口的监听器,因此:

  • 所有的工作都被中断,并且调度是关机当容器被关闭
  • 创建调度并且当容器启动时计划作业

如果你想创建这样的监听器,我可以提供更多的细节。

我希望这会有所帮助。

+1

standby和start()解决了这个问题。感谢细节。 (http://my.safaribooksonline.com/book/operating-systems-and-server-administration/0131886703/hello-quartz/ch03lev1sec2) – Kathir 2013-02-25 04:28:25

+0

只调用scheduler.standby(),然后scheduler.start()不起作用。 – aloplop85 2013-11-08 13:36:39

+0

您能否提供有关如何编写ServletContextListener以中断正在运行的所有作业并请求他们采取某些操作的详细信息。 – Vipul 2014-03-25 10:55:35

相关问题