博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
采用config方式灵活配置我们的Quarz.net中的Job,Trigger
阅读量:7238 次
发布时间:2019-06-29

本文共 3928 字,大约阅读时间需要 13 分钟。

  经常在项目中遇到定时任务的时候,通常第一个想到的是Timer定时器,但是这玩意功能太弱鸡,实际上通常采用的是专业化的第三方调度框架,比如说

Quartz,它具有功能强大和应用的灵活性,我想使用过的人都非常了解,那么本篇就来说说如何通过代码和配置文件来进行job和trigger的配置。

 

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

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

1  class Program 2     { 3         static void Main(string[] args) 4         { 5             IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler(); 6  7             scheduler.Start(); 8  9             var job = JobBuilder.Create
().Build();10 11 var trigger = TriggerBuilder.Create().WithSimpleSchedule(m => m.WithIntervalInSeconds(1)12 .RepeatForever())13 .StartNow()14 .Build();15 16 scheduler.ScheduleJob(job, trigger);17 18 Console.Read();19 }20 }

   

     上面这段代码可以看出,在BuildJob的时候,使用提供的HelloJob作为当前的定时调度的任务,下面的ISimpleTrigger的意思就是每一秒钟执行一次HelloJob,

仅此而已,然后就是HelloJob的具体定义,非常简单,实现一个IJob接口。

1     public class HelloJob : IJob2     {3         private string name = string.Empty;4         public void Execute(IJobExecutionContext context)5         {6             Console.WriteLine("当前时间: {0} ", DateTime.Now);7         }8     }

 

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

 

     这种方式貌似很完美,但是也有一个不利点,现在需求有变更,我需要将WithIntervalInSeconds(1) 改成WithIntervalInSeconds(2),也就是每秒执行

一次改成每两秒执行一次,这个就头疼了,你不得不面对改一次需求,就需要编译一次再发布,这样的伤筋动骨,我想你也不大愿意吧?面对这种需求肯定是

有办法的,不信的话,你可以往下看。

 

二:在quartz_jobs.xml定义job和trigger

    上面这种硬编码带来的坏处我也跟大家讲到了,接下来看看如何使用xml配置job和trigger,当我们从nuget中获取quartz框架的时候,应该都会发现你的

解决方案中多了一个xsd文件,但是可能有很多人并不知道这个xsd文件到底是用来干嘛的。。。。其实就是用来写xml时做代码提示用的,好了,下面我就一

步步的展示给大家。

 

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

 

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

 

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

 

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

 

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

    效率,对吧。

 

好了,下面贴出完整的xml案例,从xml中大概也能看得出来,在schedule中定义了一个job和trigger,在job-type节点中定义了需要执行job的命名空间和类名,

有点意思吧,也是最终schedule需要调度的任务。

true
sampleJob
sampleGroup
Sample job for Quartz Server
ConsoleApplication5.HelloJob,ConsoleApplication5
true
false
sampleSimpleTrigger
sampleSimpleGroup
Simple trigger to simply fire sample job
sampleJob
sampleGroup
SmartPolicy
-1
1000

 

5. job的配置文件基本上算是搞定了,然后配置Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin类来处理

这个xml文件,同时指定下quartz_jobs.xml的路径,如下所示:

1     class Program 2     { 3         static void Main(string[] args) 4         { 5             var factory = new StdSchedulerFactory(new System.Collections.Specialized.NameValueCollection() 6                 { 7                     {
"quartz.plugin.xml.fileNames","~/quartz_jobs.xml" }, 8 {
"quartz.plugin.xml.type","Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin,Quartz"} 9 });10 11 IScheduler scheduler = factory.GetScheduler();12 13 scheduler.Start();14 }15 }

 

好了,基本上就这样配置结束了,最后一点要注意的就是配置一下quartz_jobs.xml始终复制到bin文件下,如图:

 

最后跑一下源代码看看,效果咋样,看到没有,是不是很牛逼。

 

好了,现在是不是发现你的灵活性有很大提高了,如果将1s改成2s,我只需要把quartz_jobs.xml中的<repeat-interval>1000</repeat-interval>,改成

<repeat-interval>2000</repeat-interval>就可是做到对trigger的动态配置,是不是很酷。

 

最后附完整案例:

 

转载地址:http://yqrfm.baihongyu.com/

你可能感兴趣的文章
springboot 集成 websocket
查看>>
linux下oralcle11g使用edit命令默认调用vi编辑器
查看>>
Nginx网站服务
查看>>
Goko撤回其HTML5游戏平台:技术故障
查看>>
生成https的证书文件(2)
查看>>
java视频教程之十个程序员要知道的调试技巧
查看>>
RD会话主机服务器2012上没有可用的远程桌面许可证服务器
查看>>
安全的清理软件——CleanMyMac
查看>>
怎么让解压缩工具BetterZip用起来更顺手
查看>>
Ubuntu中卸载CrossOver困难?那是你没学会这个命令
查看>>
Error:Execution failed for task ':app:dexDebug'. >
查看>>
音乐时“氪”就是这个feel 用QQ音乐倍儿爽
查看>>
418合练剑指618,猫宁要给京东一个下马威?
查看>>
apache配置文件——Order Deny,Allow
查看>>
线程池原理
查看>>
我的友情链接
查看>>
Windows To Go 和典型的 Windows 安装程序之间的区别
查看>>
编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔...
查看>>
字符串最后一个单词的长度
查看>>
redis之主从以及sentinel的创建
查看>>