我正在使用来自StdSchedulerFactory
的Quartz 2.0.1调度程序。我在代码中捕获SchedulerException
。我是否需要关闭Quartz调度程序在finally块中?
我应该关闭在finally块中的调度:
} finally {
scheduler.shutdown();
}
或者我应该做try块关机?
关机方法可以抛出SchedulerException
,所以看起来关机不应该在finally块中。
我正在使用来自StdSchedulerFactory
的Quartz 2.0.1调度程序。我在代码中捕获SchedulerException
。我是否需要关闭Quartz调度程序在finally块中?
我应该关闭在finally块中的调度:
} finally {
scheduler.shutdown();
}
或者我应该做try块关机?
关机方法可以抛出SchedulerException
,所以看起来关机不应该在finally块中。
在任何情况下,您都不必在finally块中执行它,因为如果调度程序成功启动,它不会抛出SchedulerException
,因此如果您到达catch块SchedulerException
,这意味着调度程序从不是开始。所以,你不应该关闭从未开始的调度程序。
下面是项目homepage的示例程序。
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(),因为会有活动线程。
对上述答案进行抨击时,如果除开始/关闭之外还有其他代码,它可能仍会遇到问题。例如,如果你有这样的事情:
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();
}
}
}
所以,换句话说,你应该几乎肯定会调用'从某处scheduler.shutdown()'在你的代码,因为如果不这样做的应用程序可能不会停止。根据应用程序的设计,finally块可能是也可能不是正确的地方。应用程序关闭时触发的事件监听器是另一个放置'scheduler.shutdown()'的地方。不停止石英(例如在Web应用程序中)可能导致严重的类加载器相关的内存泄漏。 – 2012-02-27 08:11:58