我得到的调度程序如下:
StdScheduler schedulerBean = (StdScheduler) ApplicationContextUtil.getBean(schedulerBeanName);
schedulerBean.start();
以后
schedulerBean.shutdown();
执行其他几个代码后,我再次调用schedulerBean.start()。
现在代码抛出错误 - “org.quartz.SchedulerException:调用shutdown()后调度程序无法重启”
您能否告诉我如何解决问题?
提前致谢, 卡锡尔
答案 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();