如何正确检测然后删除无法使用Quartz.net恢复的作业?

010*_*101 4 quartz-scheduler quartz.net

由于各种有效的原因,作业存储中的某些作业很旧,无法再恢复。例如,当重构后Job类不再是.NET程序集的一部分时。我想知道如何在调度程序启动时很好地捕获这些问题,然后删除无法恢复的作业。

当应用启动时,我基本上会这样做(删节):

IScheduler scheduler = <create a scheduler and a jobstore object>

try{ scheduler.Start() } catch {}
try{ scheduler.Start() } catch {}
try{ scheduler.Start() } catch {}
Run Code Online (Sandbox Code Playgroud)

如果我打电话Start()三次,调度程序最终将启动。我之所以必须这样做,是因为Start() 它将为无法恢复的旧工作抛出异常。

Failure occured during job recovery.Could not load type 'MyOldClassName' from assembly 'MyAssembly'.

我想优雅地删除损坏的作业并避免这些异常。在我的实际代码中,我记录了这些异常。

有一个更好的方法吗?

010*_*101 5

我找到了一种方法。在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
        }
    }
Run Code Online (Sandbox Code Playgroud)