我正在使用来自StdSchedulerFactory
.
我正在捕捉SchedulerException
我的代码。
我是否应该在 finally 块中关闭调度程序:
} finally {
scheduler.shutdown();
}
还是我应该在 try 块中关闭?
关闭方法可以 throw SchedulerException
,因此关闭似乎不应该在 finally 块中。
我正在使用来自StdSchedulerFactory
.
我正在捕捉SchedulerException
我的代码。
我是否应该在 finally 块中关闭调度程序:
} finally {
scheduler.shutdown();
}
还是我应该在 try 块中关闭?
关闭方法可以 throw SchedulerException
,因此关闭似乎不应该在 finally 块中。
在任何情况下,您都不必在 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(),因为会有活动线程。
根据上述答案,如果除了启动/关闭之外还有其他代码,它可能仍然会遇到问题。例如,如果您有这样的事情:
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();
}
}
}