【问题标题】:Quartz - How to shutdown and restart the scheduler?Quartz - 如何关闭和重新启动调度程序?
【发布时间】:2013-02-22 09:19:23
【问题描述】:

我得到的调度程序如下:

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

以后

schedulerBean.shutdown();

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

现在代码抛出错误 - “org.quartz.SchedulerException: The Scheduler cannot be restarted after shutdown() has been called”

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

提前致谢, 卡西尔

【问题讨论】:

    标签: quartz-scheduler


    【解决方案1】:

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

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

    • 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() 来实现。此方法不支持集群。也就是说,它只会中断当前在此 Scheduler 实例中执行的已识别 InterruptableJob 的实例,而不是跨整个集群。
    • unscheduleJob(TriggerKey triggerKey)。从调度程序中删除指示的触发器。如果相关作业没有任何其他触发器,并且该作业不是持久的,则该作业也将被删除。

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

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

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

    我希望这会有所帮助。

    【讨论】:

    • 待机和 start() 解决了这个问题。感谢您的详细信息。 (my.safaribooksonline.com/book/…)
    • 只调用 scheduler.standby() 然后 scheduler.start() 不起作用。
    • 您能否详细说明如何编写 ServletContextListener 来中断所有正在运行的作业并要求它们采取一些措施。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-15
      相关资源
      最近更新 更多