如何为运行石英添加带有触发器的作业.. NET调度器实例,无需重新启动服务器



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

ADOJobStore的一个相当健壮的实现是使用一个自定义表来存储作业,并创建一个继承ISchedulerPlugin和IJob的类来自动为作业创建调度。

你的配置看起来像这样:

<add key="quartz.plugin.sqlquartzjobs.type" value="(JobSchedulerPlugin assembly path)" />
<add key="quartz.plugin.sqlquartzjobs.RescanCronExpression" value="0 0/5 * * * ?" /> //plugin should fire every five minutes
<add key="quartz.plugin.sqlquartzjobs.ConnectionString" value="(your connection string)" />

你的插件/作业类可以像这样:

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可以包含诸如工作名称、汇编路径、日期、状态等信息,任何可以用来帮助您有效地创建触发器的信息。它还应该包含该作业的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)

在上面的每个类中,您都可以添加自定义验证,以确保在状态或cron表达式发生变化时正确处理触发器。

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

您的数据存储是什么?

这是一个场景…不走寻常路:

你可以写一个小的控制台应用程序(或类似的),作为"Job Populater"。

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

这是我的石英配置:

<quartz>
    <!-- 
    This configuration is a way to have jobs defined in xml, but will get them written to the database.
    See https://stackoverflow.com/questions/21589964/ramjobstore-quartz-jobs-xml-to-adojobstore-data-move/ 
    -->

    <add key="quartz.plugin.xml.type" value="Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz" />
    <add key="quartz.plugin.xml.fileNames" value="~/Quartz_Jobs_001.xml" />
    <!-- 
    <add key="quartz.plugin.xml.ScanInterval" value="10" />
    -->
    <add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" />
    <add key="quartz.jobStore.driverDelegateType" value="Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz"/>
    <add key="quartz.jobStore.dataSource" value="default"/>
    <add key="quartz.dataSource.default.connectionString" value="Server=MyServerMyInstance;Database=QuartzDB;Trusted_Connection=True;Application Name='quartz_config';"/>
    <add key="quartz.dataSource.default.provider" value="SqlServer-20"/>
</quartz>

其中(如您在xml中的注释中看到的),我得到了帮助。

原文如下:RAMJobStore (quartz_jobs.xml) to AdoJobStore Data Move

相关内容

最新更新