使用configuration配置结束在quartz.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()
.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);
}
}
然后可以把程序跑起来,看看最后的一个结果,可以看到每秒钟都有一个数据输出:
这种方式貌似很完美,但是也有一个不利点,现在需求有变更,我需要将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需要调度的任务。
<?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>
5. 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文件下,如图:
最后跑一下源代码看看,效果咋样,看到没有,是不是很牛逼。
好了,现在是不是发现你的灵活性有很大提高了,如果将1s改成2s,我只需要把quartz_jobs.xml中的<repeat-interval>1000</repeat-interval>,改成
<repeat-interval>2000</repeat-interval>就可是做到对trigger的动态配置,是不是很酷。
最后附完整案例:ConsoleApplication5.zip
使用configuration配置结束在quartz.net中使用硬编码Job,Trigger任务提高灵活性的更多相关文章
- android studio 中查找代码中的硬编码
在Android Studio中同时按下Ctrl + Shift+ F 或者其他自定义的快捷键,打开全局搜索,在全局搜索中输入 ^((?!(\*|//)).)+[\u4e00-\u9fa5] 并打勾 ...
- 采用config方式灵活配置我们的Quarz.net中的Job,Trigger
经常在项目中遇到定时任务的时候,通常第一个想到的是Timer定时器,但是这玩意功能太弱鸡,实际上通常采用的是专业化的第三方调度框架,比如说 Quartz,它具有功能强大和应用的灵活性,我想使用过的人都 ...
- quartz配置参数org.quartz.jobStore.misfireThreshold含义解释
配置定时任务参数 quartz.properties文件时 需要配置jobStore的超过时间数 默认为60秒(这里单位为毫秒) org.quartz.jobStore.misfireThreshol ...
- 【Spring】简述@Configuration配置类注册BeanDefinition到Spring容器的过程
概述 本文以SpringBoot应用为基础,尝试分析基于注解@Configuration的配置类是如何向Spring容器注册BeanDefinition的过程 其中主要分析了 Configuratio ...
- Spring之@Configuration配置解析
1.简单的示例: @Configuration @EnableConfigurationProperties({DemoProperties.class}) public class DemoConf ...
- 如何管理和记录 SSIS 各个 Task 的开始执行时间和结束时间以及 Task 中添加|删除|修改的记录数
开篇语 在这篇日志中 如何在 ETL 项目中统一管理上百个 SSIS 包的日志和包配置框架 我介绍到了包级别的日志管理框架,那么这个主要是针对包这一个层级的 Log 信息,包括包开始执行和结束时间,以 ...
- 将Log4net的配置配置到的独立文件中
本文转载:http://blog.csdn.net/wanzhuan2010/article/details/7587780 另外一篇博客:http://grim1980.blog.sohu.com/ ...
- 日志管理-将Log4net的配置配置到的独立文件中
转自:http://www.cnblogs.com/zfanlong1314/p/3662679.html使用log4net已经很久了.但从来没有详情了解log4的参数,及具体使用方法.看了周公的博客 ...
- Configuration配置信息管理
Configuration配置信息管理 在前面的章节中,我们知道新版的MVC程序抛弃了原来的web.config文件机制,取而代替的是config.json,今天我们就来深入研究一下配置文件的相关内容 ...
随机推荐
- sass或scss入门
1.sass环境搭载: 安装ruby 安装sass 安装compass 配置webstorm 如果只是使用sass的话,就配置sass命名监听就好了 如图: sass目录如下: 如果配置了compas ...
- So Easy-Ntp嵌入式软件移植
一.导语和准备工作 Ntp是一种对时的软件,对客户端来说我们只要输入ntpdate IP,如ntpdate 192.168.1.254(192.168.1.254是ntp服务器,window电脑激活自 ...
- 【Egret】3D 使用中的一些疑难解决技巧!
1.问题:目前Egret3D中,发布到手机后无法响应鼠标事件 解决方法:①打开发布后的libs/module/egret/egret.web.min.js,查找e.stopPropagation(), ...
- 【转】FLEX中SharedObject介绍及应用
ShareObject介绍: 1 ShareObject,顾名思义共享对象,而通常意义上的共享,从B/S结构上来讲,无非是客户端(浏览器端)的共享和服务器端的共享了,不错,ShareObject刚好份 ...
- TableView cell自适应高度-----xib
1.通过xib创建一个cell,将label进行上左下右,进行适配, self.automaticallyAdjustsScrollViewInsets = NO; self.edgesForExte ...
- Oracle to_date函数
TO_DATE格式(以时间:2007-11-02 13:45:25为例)Year: yy two digits 两位年 显示值:07yyy three di ...
- [转]html中offsetTop、clientTop、scrollTop、offsetTop各属性介绍
HTML精确定位:scrollLeft,scrollWidth,clientWidth,offsetWidth scrollHeight: 获取对象的滚动高度. scrollLeft:设置或获取位于对 ...
- 【iOS】7.4 定位服务->3.4 地图框架MapKit 功能4:地图截图
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...
- vue实现简单表格组件
本来想这一周做一个关于vuex的总结的,但是由于朋友反应说还不知道如何用vue去写一个组件,所以在此写写一篇文章来说明下如何去写vue页面或者组件.vue的核心思想就是组件,什么是组件呢?按照我的理解 ...
- html 压缩工具 html-minifier
https://github.com/kangax/html-minifier#options-quick-reference 1.参数列表 option Description Default re ...