转载

采用config方式灵活配置我们的Quarz.net中的Job,Trigger

经常在项目中遇到定时任务的时候,通常第一个想到的是Timer定时器,但是这玩意功能太弱鸡,实际上通常采用的是专业化的第三方调度框架,比如说Quartz,它具有功能强大和应用的灵活性,我想使用过的人都非常了解,那么本篇就来说说如何通过代码和配置文件来进行job和trigger的配置。

一:常规的job,trigger配置方式

这种常规的方式也是我们初步学习Quartz最先了解到的,即通过 JobBuilder 和 TriggerBuilder 来链式一个IJobDetail和ISimpleTrigger,比如下面的代码。

    class Program
    {
        static void Main(string[] args)
        {
            IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();

            scheduler.Start();

            var job = JobBuilder.Create<HelloJob>().Build();

            var trigger = TriggerBuilder.Create().WithSimpleSchedule(m => m.WithIntervalInSeconds(1)
                                                                            .RepeatForever())
                                                 .StartNow()
                                                 .Build();

            scheduler.ScheduleJob(job, trigger);

            Console.Read();
        }
    }

上面这段代码可以看出,在BuildJob的时候,使用提供的 HelloJob 作为当前的定时调度的任务,下面的ISimpleTrigger的意思就是每一秒钟执行一次HelloJob,仅此而已,然后就是HelloJob的具体定义,非常简单,实现一个IJob接口。

    public class HelloJob : IJob
    {
        private string name = string.Empty;
        public void Execute(IJobExecutionContext context)
        {
            Console.WriteLine("当前时间: {0} ", DateTime.Now);
        }
    }

接下来可以把程序跑起来,看看最后的一个结果,可以看到每秒钟都有一个数据输出:

采用config方式灵活配置我们的Quarz.net中的Job,Trigger

这种方式貌似很完美,但是也有一个不利点,现在需求有变更,我需要将WithIntervalInSeconds(1) 改成WithIntervalInSeconds(2),也就是每秒执行一次改成每两秒执行一次,这个就头疼了,你不得不面对改一次需求,就需要编译一次再发布,这样的伤筋动骨,我想你也不大愿意吧?这种需求肯定是有办法的,不信的话,你可以往下看。

二:在quartz_jobs.xml定义job和trigger

上面这种硬编码带来的坏处我也跟大家讲到了,接下来看看如何使用xml配置job和trigger,当我们从nuget中获取quartz框架的时候,应该都会发现你的解决方案中多了一个xsd文件,可能有很多人并不知道这个xsd文件到底是用来干嘛的。。。。其实就是用来写xml时做代码提示用的,好了,下面我就一步步的展示给大家。

  • 从nuget下载文件,没什么好说的,在“引用”上右击鼠标,选择“管理NuGet程序包”看下图:

采用config方式灵活配置我们的Quarz.net中的Job,Trigger

采用config方式灵活配置我们的Quarz.net中的Job,Trigger

然后你会看到多了一个job_scheduling_data_2_0.xsd文件。

采用config方式灵活配置我们的Quarz.net中的Job,Trigger

  • 接下来新建一个quartz_jobs.xml文件,然后选中visual studio中的xml菜单栏,选中“架构”菜单项。

采用config方式灵活配置我们的Quarz.net中的Job,Trigger

  • 在弹出的对话框中,选择“添加”按钮,找到从nuget中生成的job_scheduling_data_2_0.xsd,然后点击完成。

采用config方式灵活配置我们的Quarz.net中的Job,Trigger

  • 然后就可以在xml中自由的编码,你会发现关于job和trigger的代码有提示了。。。这极大的提高了我们的开发效率,对吧。

采用config方式灵活配置我们的Quarz.net中的Job,Trigger

采用config方式灵活配置我们的Quarz.net中的Job,Trigger

好了,下面贴出完整的xml案例,从xml中大概也能看得出来,在schedule中定义了一个job和trigger,在job-type节点中定义了需要执行job的命名空间和类名,有点意思吧,也是最终schedule需要调度的任务。

<?xml version="1.0" encoding="utf-8" ?>
<job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData">
  <processing-directives>
    <overwrite-existing-data>true</overwrite-existing-data>
  </processing-directives>

  <schedule>
    <job>
      <name>sampleJob</name>
      <group>sampleGroup</group>
      <description>Sample job for Quartz Server</description>
      <job-type>ConsoleApplication5.HelloJob,ConsoleApplication5</job-type>
      <durable>true</durable>
      <recover>false</recover>
    </job>
    <trigger>
      <simple>
        <name>sampleSimpleTrigger</name>
        <group>sampleSimpleGroup</group>
        <description>Simple trigger to simply fire sample job</description>
        <job-name>sampleJob</job-name>
        <job-group>sampleGroup</job-group>
        <misfire-instruction>SmartPolicy</misfire-instruction>
        <repeat-count>-1</repeat-count>
        <repeat-interval>1000</repeat-interval>
      </simple>
    </trigger>
  </schedule>
</job-scheduling-data>
  • job的配置文件基本上算是搞定了,然后配置 Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin 类来处理这个xml文件,同时指定下quartz_jobs.xml的路径,如下所示:

    class Program
    {
        static void Main(string[] args)
        {
            var factory = new StdSchedulerFactory(new System.Collections.Specialized.NameValueCollection()
                {
                    {"quartz.plugin.xml.fileNames","~/quartz_jobs.xml" },
                    {"quartz.plugin.xml.type","Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin,Quartz"}
                });

            IScheduler scheduler = factory.GetScheduler();

            scheduler.Start();
        }
    }

好了,基本上就这样配置结束了,最后一点要注意的就是配置一下 quartz_jobs.xml 始终复制到bin文件下,然后跑一下源代码看看,效果咋样,看到没有,是不是很:ox::nose:。

采用config方式灵活配置我们的Quarz.net中的Job,Trigger

好了,如果将1s改成2s,我只需要把quartz_jobs.xml中的 1000 ,改成

2000 就可是做到对trigger的动态配置,如下图:

采用config方式灵活配置我们的Quarz.net中的Job,Trigger

原文  http://mp.weixin.qq.com/s?__biz=MzAwNTMxMzg1MA==&mid=2654079131&idx=4&sn=1159d87d300aae85d16c8911ddfbe495
正文到此结束
Loading...