我在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有内置功能吗? 或者我是否必须构建一些可以卸载所有作业/计划并重新加载它们的逻辑? 如果我删除当前正在运行的作业,该作业是停止还是继续?
有关实施此方法的最佳方法的任何建议都会很棒。
答案 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;
}