Quartz.Net实现Windows定时任务调度服务
1 Quartz.Net介绍
Quartz.Net是一个开源的任务调度框架,非常强大,能够通过简单的配置帮助我们定时具体的操作。 Windows服务里面使用Quartz.net,并且使用配置的方式来设置触发器。它能够帮我们定时的做事,相当于闹钟能够叫我们起床一样。
2 创建windows服务
2.1 C#创建一个Windows Service项目
public partial class Service : ServiceBase { private IScheduler scheduler; public Service() { InitializeComponent(); } protected override void OnStart(string[] args) { //todo:这里是服务启动所执行的代码 ISchedulerFactory schedulerFactory = new StdSchedulerFactory(); scheduler = schedulerFactory.GetScheduler(); scheduler.Start(); LogHelper.WriteLog("Service.OnStart"); } protected override void OnStop() { //todo:这里是服务停止所执行的代码 scheduler.Shutdown(); LogHelper.WriteLog("Service.OnStop"); } }
2.2 两个重要的方法
- OnStart – 控制服务启动
- OnStop – 控制服务停止
3 Quartz的配置及JOB相关
3.1 配置
<?xml version="1.0" encoding="UTF-8"?> <!-- This file contains job definitions in schema version 2.0 format --> <job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"> <processing-directives> <overwrite-existing-data>true</overwrite-existing-data> </processing-directives> <schedule> <job> <name>DemoJob</name> <group>DemoJobGroup</group> <description>测试任务</description> <job-type>SchoolPal.WindowServices.Jobs.DemoJob,SchoolPal.WindowServices</job-type> <durable>true</durable> <recover>false</recover> </job> <trigger> <cron> <name>ClassClosingJobTrigger</name> <group>ClassClosingJobTriggerGroup</group> <job-name>ClassClosingJob</job-name> <job-group>ClassClosingJobGroup</job-group> <!--每天0点触发--> <cron-expression>0 0 0 * * ?</cron-expression> </cron> </trigger> </schedule> </job-scheduling-data>
3.2 Job
新建一个SynchronousData类,让其实现IJob接口来实现SystemScheduler中自定义的任务
public class SynchronousData : IJob { public void Execute(IJobExecutionContext context) { string Url = ((NameValueCollection)ConfigurationSettings.GetConfig('JobList/Job'))['Url']; WebClient wc = new WebClient(); WebRequest wr = WebRequest.Create(new Uri(Url)); using (StreamWriter sw = File.AppendText(@'d:SchedulerService.txt')) { sw.WriteLine('------------------' + 'MyService服务在:' + DateTime.Now.ToString('yyyy-MM-dd HH:mm:ss') + ' 执行了一次任务' + '------------------'); sw.Flush(); } } }