我是否需要在finally块中关闭Quartz调度程序?

时间:2012-02-22 13:13:05

标签: java quartz-scheduler try-catch-finally

我正在使用StdSchedulerFactory中的Quartz 2.0.1调度程序。

我在代码中捕捉SchedulerException

我应该在finally块中关闭调度程序:

} finally {
    scheduler.shutdown();
}

或者我应该在try块中关闭吗?

shutdown方法可以抛出SchedulerException,所以看起来关闭不应该在finally块中。

2 个答案:

答案 0 :(得分:0)

在任何情况下你都不必在finally块中执行它,因为如果调度程序成功启动它将不会抛出SchedulerException,因此如果你到达{{1}的catch块这意味着调度程序从未启动过。因此,您不应该关闭从未启动的调度程序。

以下是项目homepage的示例程序。

SchedulerException

另外,从上面的链接,

  

使用StdSchedulerFactory.getDefaultScheduler()获取调度程序后,在调用scheduler.shutdown()之前,应用程序不会终止,因为会有活动线程。

答案 1 :(得分:0)

重复上述答案,如果有其他代码而不是启动/关闭,它仍可能会遇到问题。例如,如果你有这样的东西:

public class QuartzTest {
    public static void main(String[] args) {

        try {
            // Grab the Scheduler instance from the Factory 
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

            // and start it off
            scheduler.start();
            System.out.println(args[5]);
            scheduler.shutdown();

        } catch (SchedulerException se) {
            se.printStackTrace();
        }
    }
}

应用程序永远不会调用shutdown,因为你最终会得到一个ArrayIndexOutOfBoundsException(或类似的东西)。有很多方法可以解决这个问题,但最简单的方法是将所有中间代码包装在异常处理程序中并“处理”那里的东西。例如: 公共类QuartzTest {

public static void main(String[] args) {

    try {
        // Grab the Scheduler instance from the Factory 
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

        // and start it off
        scheduler.start();
        try {
             System.out.println(args[5]);
        } catch (Exception e) {
             e.printStackTrace();
        }
        scheduler.shutdown();

    } catch (SchedulerException se) {
        se.printStackTrace();
    }
}

}