quartz-scheduler - 如何正确检测并删除无法使用 Quartz.net 恢复的作业?

标签 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 {}

如果我打电话Start()三次,调度程序最终启动。我必须做这件骇人听闻的事情的原因是因为 Start()将为不可恢复的旧作业抛出异常。
Failure occured during job recovery.Could not load type 'MyOldClassName' from assembly 'MyAssembly'.
我想优雅地删除损坏的作业并避免这些异常。在我的实际代码中,我记录了这些异常。

有一个更好的方法吗?

最佳答案

我找到了一种方法来做到这一点。在 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
        }
    }

关于quartz-scheduler - 如何正确检测并删除无法使用 Quartz.net 恢复的作业?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26349519/

相关文章:

c# - CaSTLe.Windsor 生活方式取决于上下文?

c# - 可执行文件因奇怪的异常而失败

asp.net-mvc-4 - Quartz.NET 触发器不触发,MVC4

c# - 使用 Quartz .NET 和 AdoJobStore 调度通用 IJob<>

jakarta-ee - 用于将 Quartz 与 CDI 一起使用的自定义 CDJobFactory

java - 启动 Quartz Scheduler 而不触发触发器

java - 一种根据给定时间表运行任务的方法

spring-boot - org.quartz.SchedulerException : Jobs added with no trigger must be durable

.net - WinForms - 如何在不传递委托(delegate)的情况下从单独的线程访问/调用 UI 线程中的方法?

java-ee-6 - Apache Tomee 中用于计时器执行的 EJB-3.1 @Startup 和 @Schedule 注释