如何定期在Quartz.Net中重新加载所有作业和日程安排?

时间:2017-07-14 09:19:40

标签: c# quartz.net

我在Windows服务中使用Quartz.net来安排我的数据库中存在的作业。

我的用户将拥有此表的前端,以便他们可以更改CRON表达式。目前,我的应用程序没有任何逻辑来更改CRON表达式或添加/删除作业而不重新启动服务(因为这将触发重新加载作业)。 我使用以下代码从我的数据库加载所有作业。

protected void LoadJobs()
{
    logger.Info("Loading jobs.");
    var jobs = middlewareRepository.GeActiveJobs();

    foreach (var job in jobs)
    {
        IJobDetail jobDetail = JobBuilder.Create<JobDespatcher>()
            .WithIdentity(job.Description)
            .UsingJobData("JobId", job.Id)
            .Build();

        ITrigger trigger = TriggerBuilder.Create()
            .WithCronSchedule(job.CronExpression)
            .Build();

        scheduler.ScheduleJob(jobDetail, trigger);
        logger.InfoFormat("Job with id {0} ({1}) has been scheduled.", job.Id, job.Description);
    }
}

如何清除调度程序队列并重新加载作业...比如每小时检查一次? Quartz.Net有内置功能吗? 或者我是否必须构建一些可以卸载所有作业/计划并重新加载它们的逻辑? 如果我删除当前正在运行的作业,该作业是停止还是继续?

有关实施此方法的最佳方法的任何建议都会很棒。

2 个答案:

答案 0 :(得分:1)

我认为你可以关闭调度程序并重新开始。

scheduler.Shutdown();
//Recreate the scheduler
//Recreate jobs
scheduler.Start();

答案 1 :(得分:0)

首先,我不知道为什么PinBack的答案被低估了。这不是一个疯狂的回答。

其次,虽然我认为PinBack很接近,但我会添加一些我会考虑的评论和代码。

首先是API的链接。

http://quartznet.sourceforge.net/apidoc/2.0/html/

因为没有&#34; .Refresh&#34;方法.....你可能会考虑下面的代码.....如果调度程序已经存在,它会正常关闭它。然后它会强制刷新&#34; (也就是说,对GetScheduler进行一次新的调用),然后启动它,并返回新刷新的调度程序。

    private IScheduler InitializeOrRefreshScheduler(IScheduler existingScheduler)
    {
        IScheduler returnSchedule = null;

        if (null != existingScheduler)
        {
            existingScheduler.Shutdown(true); /* gracefully shut down the scheduler http://quartznet.sourceforge.net/apidoc/2.0/html/html/31359f2c-7a57-50e8-5e8b-102ceb3991c9.htm */
        }
        else
        {
            /* the existingScheduler is null, so it would be null on "first startup" */
        }

        var config = (NameValueCollection)ConfigurationManager.GetSection("quartz");

        ISchedulerFactory factory = new StdSchedulerFactory(config);
        returnSchedule = factory.GetScheduler();    
        returnSchedule.Start();             

        return returnSchedule;
    }