2

我正在使用来自StdSchedulerFactory.

我正在捕捉SchedulerException我的代码。

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

} finally {
    scheduler.shutdown();
}

还是我应该在 try 块中关闭?

关闭方法可以 throw SchedulerException,因此关闭似乎不应该在 finally 块中。

4

2 回答 2

0

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

这是来自项目主页的示例程序。

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();

            scheduler.shutdown();

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

另外,从上面的链接,

一旦您使用 StdSchedulerFactory.getDefaultScheduler() 获得调度程序,您的应用程序将不会终止,直到您调用 scheduler.shutdown(),因为会有活动线程。

于 2012-02-22T13:30:33.710 回答
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();
        }
    }
}

应用程序永远不会调用关闭,因为您最终会得到一个 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();
    }
}

}

于 2012-02-22T13:42:14.557 回答