Quartz - 如何关闭和重启调度程序?

时间:2013-02-22 09:19:24

标签: quartz-scheduler

我得到的调度程序如下:

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

以后

schedulerBean.shutdown();

执行其他几个代码后,我再次调用schedulerBean.start()。

现在代码抛出错误 - “org.quartz.SchedulerException:调用shutdown()后调度程序无法重启”

您能否告诉我如何解决问题?

提前致谢, 卡锡尔

2 个答案:

答案 0 :(得分:8)

关闭调度程序后,由于线程和其他资源被永久销毁,因此无法重新启动。

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

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

请注意,您可以创建一个实现ServletContextListener接口的侦听器,以便:

  • 当容器关闭时,所有作业都被中断,调度程序关闭
  • 创建调度程序并在启动容器时安排作业

如果您想创建这样的监听器,我可以提供更多详细信息。

我希望这会有所帮助。

答案 1 :(得分:0)

只需在schedulerBean.Shutdown()之后删除调度程序对象,然后像第一次一样再次调用调度程序方法。

schedulerBean.Shutdown();    
   //do some work 
schedulerBean = null;
StdScheduler schedulerBean = (StdScheduler) ApplicationContextUtil.getBean(schedulerBeanName);
schedulerBean.Start();