我正在使用StdSchedulerFactory
中的Quartz 2.0.1调度程序。
我在代码中捕捉SchedulerException
。
我应该在finally块中关闭调度程序:
} finally {
scheduler.shutdown();
}
或者我应该在try块中关闭吗?
shutdown方法可以抛出SchedulerException
,所以看起来关闭不应该在finally块中。
答案 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();
}
}
}