【问题标题】:How do I reload all jobs and schedules in Quartz.Net periodically?如何定期重新加载 Quartz.Net 中的所有作业和计划?
【发布时间】:2017-07-14 09:19:40
【问题描述】:

我在 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 有内置函数来执行此操作吗? 或者我是否必须构建一些逻辑来卸载所有作业/时间表并重新加载它们? 如果我删除当前正在运行的作业,该作业会停止还是继续?

任何关于实现这一点的最佳方式的建议都会很棒。

【问题讨论】:

  • Quartz 有足够的方法来更改和重新安排您的作业和触发器。使用它而不是重新启动调度程序。也无需将作业/触发器信息保存在单独的表中。 Quartz 可以与您的数据库交互以保存所有作业的状态。

标签: c# quartz.net


【解决方案1】:

我认为您可以关闭调度程序并重新启动。

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

【讨论】:

  • 我假设这会杀死所有正在运行的作业?
  • 您也可以使用void Shutdown(bool waitForJobsToComplete)。描述waitForJobsToComplete: if true the scheduler will not allow this method to return until all currently executing jobs have completed.
【解决方案2】:

首先,我不知道为什么 PinBack 的答案被否决了。这不是一个离题的疯狂答案。

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

首先是指向 API 的链接。

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

由于没有“.Refresh”方法......你可以考虑下面的代码......如果调度程序已经存在,它将优雅地关闭它。然后它将强制“刷新”(也就是对 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;
    }

【讨论】:

    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    相关资源
    最近更新 更多