如前所述,在全局级别“检测”JobExecutionException 的正确方法是实现并注册一个 IJobListener 并检查 JobWasExecuted() 方法中的 JobExecutionException 参数是否为 != null。
然而,我遇到的问题(从 OP 的附加评论来看,他也面临这个问题)是 Quartz 没有处理 JobExecutionException (因为它应该),这导致了一个未处理的异常杀死了应用程序。
到目前为止,我使用的是 Quartz.NET 2.0.1 版本 (.NET3.5) 包中的预编译 DLL。为了解决问题,我引用了 Quartz 项目/源代码,令我惊讶的是它突然工作了?!
有趣的是,这是执行 IJob 并处理 JobExecutionException 的Quartz 库代码:
try {
if (log.IsDebugEnabled) {
log.Debug("Calling Execute on job " + jobDetail.Key);
}
job.Execute(jec);
endTime = SystemTime.UtcNow();
} catch (JobExecutionException jee) {
endTime = SystemTime.UtcNow();
jobExEx = jee;
log.Info(string.Format(CultureInfo.InvariantCulture, "Job {0} threw a JobExecutionException: ", jobDetail.Key), jobExEx);
} catch (Exception e) {
// other stuff here...
}
接下来是直接引用我新编译的 DLL,这也很有效。可悲的是,我无法告诉您为什么这样做有效,而且我目前没有时间进一步研究它,但也许这对某人有所帮助。也许其他人可以证实这一点,甚至做出解释。它可能与不同的目标平台(x86/64bit)有关?