Quartz 预定作业未触发 - 可能出现未处理的异常?

ohs*_*kay 4 java exception scheduler quartz-scheduler

我有一个使用 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
Run Code Online (Sandbox Code Playgroud)

这里要注意的重点是Exception 本身没有被捕获

因此,假设被调用的方法引发了未处理的异常。

public void methodBeingInvoked() throws UnhandledException {
Run Code Online (Sandbox Code Playgroud)

这里会发生什么?

Kie*_*xon 5

从 Job 抛出的任何Throwable都将被 Quartz 捕获并包装在 JobExecutionException 中,并且不会重新触发。请参阅JobRunShell#run的源代码

Quartz 网站上有一些文档与此相矛盾,但是在查看 Quartz 1.8.x/2.0.x/2.1.x 源代码后,所有版本的文档都是错误的。

Job 的 execute 方法应该包含一个 try-catch 块来处理所有可能的异常。

如果作业抛出异常,Quartz 通常会立即重新执行它(并且它可能会再次抛出相同的异常)。如果作业捕获它可能遇到的所有异常,处理它们并重新安排自身或其他作业,则更好。解决这个问题。