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();
        }
     }
}