·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> ASP.NET网站开发 >> Quartz.net使用总结
进来项目中用到了 任务调度 来实现短信发送网关,所以这里分享下Quartz.net 的使用经验。任务调度选用了 Quartz.net 来实现,之前用的是C#中自带的window服务安装,这次也打算用Topshel来做window服务,其实感觉差不多。ok,接下来说下 Quartz.net 在开发中的使用:
Quartz.NET简介
作业调度的目标在于按照预先确定的时间和指定的顺序来确保高效的数据处理流程,从而最大限度的使用系统资源。批处理流程是一种在无需最终用户干预的方式下在后台通过顺序方式运行的操作。
Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等。
Quartz.NET 是一个开源的作业调度框架,它可以被在小型应用程序甚至是企业级的应用程序。它有如下几个特点:
Quartz.NET使用
首先引用下面的dll
前4个是Quartz.NET使用所必须的,Toshelf是用来做window服务所用的
添加QuartzHelp类库
添加JobDemo.cs,实现IJob接口。
1 namespace QuartzHelp 2 { 3 public class JobDemo : IJob 4 { 5 //日志对象 6 PRivate static readonly ILog logger = LogManager.GetLogger(typeof(JobDemo)); 7 8 public void Execute(IJobExecutionContext context) 9 {10 logger.Info("JobDemo开始运作,模拟处理200ms的程序");11 Thread.Sleep(200);12 logger.Info("JobDemo处理完");13 }14 }15 }View Code
添加WindowControl 控制台
添加Service.cs文件,作为任务调度的入口
1 namespace WindowControl 2 { 3 public class Service 4 { 5 private readonly ILog logger; 6 private IScheduler scheduler; 7 public Service() 8 { 9 logger = LogManager.GetLogger(typeof(Service));10 ISchedulerFactory schedulerFactory = new StdSchedulerFactory();11 scheduler = schedulerFactory.GetScheduler();12 }13 14 public void Start()15 {16 scheduler.Start();17 logger.Info("Quartz服务成功启动");18 }19 20 public void Stop()21 {22 scheduler.Shutdown(true);23 logger.Info("Quartz服务成功终止");24 }25 26 }27 }View Code
在Program.cs文件中,启动任务调度
1 namespace WindowControl 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 HostFactory.Run(x => 8 { 9 x.Service<Service>((s) =>10 {11 s.SetServiceName("ser");12 s.ConstructUsing(name => new Service());13 s.WhenStarted((t) => t.Start());14 s.WhenStopped((t) => t.Stop());15 });16 17 x.RunAsLocalSystem();18 19 //服务的描述20 x.SetDescription("任务服务安装测试");21 //服务的显示名称22 x.SetDisplayName("MyDisplayName");23 //服务名称24 x.SetServiceName("MyServiceName");25 26 });27 }28 }29 }View Code
添加配置文件
新建一个Configs的文件夹,首先添加quartz_jobs.xml(作为 调度任务 的配置文件)
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <!-- This file contains job definitions in schema version 2.0 format --> 4 5 <job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"> 6 7 <processing-directives> 8 <!-- 在计划作业和触发器是应遵循的命令和原则 --> 9 <overwrite-existing-data>true</overwrite-existing-data>10 </processing-directives>11 12 <schedule>13 <job>14 <name>myJob</name>15 <group>myJobGroup</group>16 <description>第一个工作任务</description>17 <job-type>QuartzHelp.JobDemo, QuartzHelp</job-type>18 <durable>true</durable>19 <recover>false</recover>20 </job>21 <trigger>22 <cron>23 <name>Trigger</name>24 <group>TriggerGroup</group>25 <description>Simple trigger to simply fire sample job</description>26 <job-name>myJob</job-name>27 <job-group>myJobGroup</job-group>28 <!--每10秒中执行一次-->29 <cron-expression>0/01 * * * * ?</cron-expression>30 </cron>31 </trigger>32 </schedule>33 </job-scheduling-data>View Code
quartz_jobs.xml配置项说明:
1 <?xml version="1.0" encoding="utf-8" ?> 2 <!-- This file contains job definitions in schema version 2.0 format --> 3 4 <!--在2.0版本中根结点由<quartz> 变为了<job-scheduling-data>--> 5 <job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"> 6 7 <!--保持默认配置即可,具体作用有待研究--> 8 <processing-directives> 9 <overwrite-existing-data>true</overwrite-existing-data>10 </processing-directives>11 12 <!--任务调度集合-->13 <schedule>14 <!--2.0版本中的job相当于1.x版本中的<job-detail>,这个节点是用来定义每个具体的任务的,多个任务请创建多个job节点即可-->15 <job>16 <!--任务名称,同一个group中多个job的name不能相同,若未设置group则所有未设置group的job为同一个分组(必须设置)-->17 <name>sampleJob</name>18 <!--任务所属分组,用于标识任务所属分组-->19 <group>sampleGroup</group>20 <!--工作任务的描述,用于描述任务具体内容-->21 <description>Sample job for Quartz Server</description>22 <!--任务类型,任务的具体类型及所属程序集,格式:实现了IJob接口的包含完整命名空间的类名,程序集名称-->23 <job-type>Quartz.Server.SampleJob, Quartz.Server</job-type>24 <!--<durable>(持久性)-如果一个Job是不持久的, 一旦没有触发器与之关联,它就会被从scheduler 中自动删除-->25 <durable>true</durable>26 <recover>false</recover>27