我有一个使用Quartz库的预定作业的Web应用程序。最近我遇到的情况是工作似乎没有被解雇。我做了一些阅读,显然如果作业抛出异常,Quartz调度程序将尝试再次执行作业。这是真的吗?
无论如何,我根据上述陈述为真的假设做了一些故障排除。所以我要说我有以下代码片段:
try {
method.invoke(object, params);
}
catch (ExceptionA ea) {
ea.printStackTrace();
}
catch (ExceptionB eb) {
eb.printStackTrace();
}
// and so on so forth, catching a bunch of specific Exceptions
需要注意的重点是异常本身未被捕获。
因此,假设被调用的方法抛出了一个未处理的异常。
public void methodBeingInvoked() throws UnhandledException {
这里发生了什么?
答案 0 :(得分:4)
从作业中抛出的任何 Throwable 将被Quartz捕获并包含在JobExecutionException中,并且不会被激活。 请参阅JobRunShell#run
的源代码有一些documentation on the Quartz website与此相矛盾,但在查看Quartz 1.8.x / 2.0.x / 2.1.x源代码之后,所有版本的文档都是错误的。
Job的execute方法应该包含一个处理的try-catch块 所有可能的例外。
如果作业抛出异常,Quartz通常会立即生效 重新执行它(它可能会再次抛出相同的异常)。 如果作业捕获它可能遇到的所有异常,处理,那就更好了 他们,并重新安排自己,或其他工作。解决这个问题。