如何添加触发器来运行Quartz.Net调度程序实例而不重启服务器?

是否可以添加带有触发器的作业来运行Quartz.NET调度程序实例而无需重新启动服务器?

使用ADOJobStore的一个相当强大的实现是拥有一个自定义表来存储作业,并创建一个inheritance自ISchedulerPlugin和IJob的类,以自动为您的作业创建计划。

您的配置如下所示:

  //plugin should fire every five minutes  

你的插件/工作类可能如下所示:

 public class JobSchedulerPlugin : ISchedulerPlugin, IJob { //Entry point for plugin, quartz server runs when it starts public void Initialize(string pluginName, IScheduler sched) { Name = pluginName; Scheduler = sched; } //Runs after Initialize() public void Start() { //schedule plugin as a job JobDataMap jobData = new JobDataMap(); jobData["ConnectionString"] = ConnectionString; IJobDetail job = JobBuilder.Create(this.GetType()) .WithDescription("Job to rescan jobs from SQL db") .WithIdentity(new JobKey(JobInitializationPluginJobName, JobInitializationPluginGroup)) .UsingJobData(jobData) .Build(); TriggerKey triggerKey = new TriggerKey(JobInitializationPluginJobTriggerName, JobInitializationPluginGroup); ITrigger trigger = TriggerBuilder.Create() .WithCronSchedule(ConfigFileCronExpression) .StartNow() .WithDescription("trigger for sql job loader") .WithIdentity(triggerKey) .WithPriority(1) .Build(); Scheduler.ScheduleJob(job, trigger); } } 

现在,JobSchedulerPlugin已经进入QRTZ_TRIGGERS的触发器,该触发器将以最高优先级每五分钟触发一次。 您可以使用它从自定义表中加载作业(我们称之为QUARTZJOBS)。 QUARTZJOBS可以包含诸如工作名,assembly路径,日期,状态等信息,以及可用于帮助您有效创建触发器的任何信息。 它还应该包含作业的cron表达式。 这是触发器触发时可以执行的操作:

 //Entry point of every job public void Execute(IJobExecutionContext context) { Scheduler = context.Scheduler; JobCollection jobs = LoadJobs(context.JobDetail.JobDataMap["ConnectionString"].ToString()); JobsWithTriggers jobTriggers = CreateTriggers(jobs); SchedulerJob(jobTriggers); } //You can use ADO.NET or an ORM here to load job information from the the table //and push it into a class. protected JobCollection LoadJobs(string connectionString); //In this class you can create JobDetails and ITriggers for each job //and push them into a custom class protected JobsWithTriggers CreateTriggers(jobs); //Finally here you can schedule the jobs protected void ScheduleJobs(jobstriggers) 

在上面的每个类中,您可以添加自定义validation,以确保在状态或cron表达式更改时正确处理触发器。

使用此解决方案,永远不需要重新启动服务器。 插件/作业类将扫描表并采取相应措施。

你的数据存储是什么?

这是一个场景……有点偏僻的道路:

您可以编写一个小型控制台应用程序(或类似的),即“Job Populater”。

您可以将其连接到从xml文件中提取作业定义,并将它们推送到ADO数据存储区(sql server)。

这是我的石英配置来做到这一点:

            

哪个(正如你在xml的评论中看到的那样),我得到了帮助。

这是原始的: RAMJobStore(quartz_jobs.xml)到AdoJobStore Data Move