由于各种正当理由,作业商店中的某些工作已经过时,无法再恢复。例如,当Job类不再是重构后.NET程序集的一部分时。我想知道如何在调度程序启动时优雅地捕获这些问题,然后删除不可恢复的作业。
当应用程序启动时,我基本上这样做(删节):
IScheduler scheduler = <create a scheduler and a jobstore object>
try{ scheduler.Start() } catch {}
try{ scheduler.Start() } catch {}
try{ scheduler.Start() } catch {}
如果我拨打Start()
三次,调度程序最终会启动。我必须做这个hacky事情的原因是因为Start()
将为不可恢复的旧作业抛出异常。
Failure occured during job recovery.
和Could not load type 'MyOldClassName' from assembly 'MyAssembly'.
我想优雅地删除已损坏的作业并避免这些异常。在我的实际代码中,我记录了这些异常。
有更好的方法吗?
答案 0 :(得分:4)
我找到了一种方法。在Start()之前调用此方法可以解决问题。
var jobs = this._scheduler.GetJobKeys(GroupMatcher<JobKey>.AnyGroup());
foreach (var jobKey in jobs)
{
try
{
// attempt to access the jobType. If it fails, then we know it's broken
Type t = _scheduler.GetJobDetail(jobKey).JobType;
}
catch (JobPersistenceException ex)
{
if (ex.InnerException != null)
{
if (ex.InnerException.GetType() == typeof(TypeLoadException))
{
_scheduler.DeleteJob(jobKey);
}
}
else
{
// log this
}
}
catch (Exception ex)
{
// log this
}
}