9

我得到的调度程序如下:

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

然后

schedulerBean.shutdown();

在执行了一些其他代码之后,我再次调用 schedulerBean.start() 。

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

你能告诉我如何解决这个问题吗?

提前致谢, 凯瑟尔

4

2 回答 2

9

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

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

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

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

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

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

我希望这有帮助。

于 2013-02-24T17:49:41.890 回答
0

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

schedulerBean.Shutdown();    
   //do some work 
schedulerBean = null;
StdScheduler schedulerBean = (StdScheduler) ApplicationContextUtil.getBean(schedulerBeanName);
schedulerBean.Start();
于 2020-04-01T12:57:46.123 回答