你的位置:首页 > ASP.net教程

[ASP.net教程]Quartz.NET总结(一)


  前段时间,花了大量的时间,将原先的计划任务,切换到Quartz.NET来进行管理。原先的后台定时服务都是通过计划任务来实现的,但是随着业务增长,计划任务也越来越多,每个后台服务,都得创建一个计划任务。日常的维护和管理非常麻烦。

 

  于是乎,一咬牙,决定引入Quartz.NET框架,统一都管理全部的后台定时服务。

 

  Quartz.NET的优点和使用场景,这里不再多说,网上有很多说明,总的来说就是,Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等。 Quartz.NET允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联,配置灵活方便。

 

  参考官方学习文档:http://www.quartz-scheduler.net/documentation/index.html

 

  快速搭建一个Quartz,源代码下载

  第一步:新建解决方案和相关项目,并安装相关程序包,如下图所示:

      

        Quartz依赖Common.Logging和Common.Logging.Log4Net,而且Log4Net也是比较熟悉的日志工具,因此我们实际使用中,也是log4net记录日志,另外定时作业一般都是在window服务中,我们也可用Topshelf来创建我们的window服务。

 

  第二步:创建两个Job类DemoJob1,DemoJob2。实现IJob,在Execute方法里编写要处理的业务逻辑,系统就会按照Quartz的配置,定时处理。

  using System;
  namespace Quartz.Net.Jobs
  {
    /// <summary>
    /// 实现IJob接口
    /// </summary>
    public class DemoJob1 : IJob
    {
      private static readonly Common.Logging.ILog logger = Common.Logging.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
      public void Execute(IJobExecutionContext context)
      {
        try
        {
          logger.Info("DemoJob1 任务开始运行");

          for (int i = 0; i < 10; i++)
          {
            logger.InfoFormat("DemoJob1 正在运行{0}", i);
          }

          logger.Info("DemoJob1任务运行结束");
        }
        catch (Exception ex)
        {
          logger.Error("DemoJob2 运行异常", ex);
        }

      }
    }
  }

  第三步:配置quartz.config、quartz_jobs.

  quartz.config

  # You can configure your scheduler in either <quartz> configuration section

  # or in quartz properties file

  # Configuration section has precedence

  quartz.scheduler.instanceName = QuartzTest

  # configure thread pool info

  quartz.threadPool.type = Quartz.Simpl.SimpleThreadPool, Quartz

  quartz.threadPool.threadCount = 10

  quartz.threadPool.threadPriority = Normal

  # job initialization plugin handles our

  quartz.plugin.

  quartz.plugin.

  # export this server to remoting context

  #quartz.scheduler.exporter.type = Quartz.Simpl.RemotingSchedulerExporter, Quartz

  #quartz.scheduler.exporter.port = 555

  #quartz.scheduler.exporter.bindName = QuartzScheduler

  #quartz.scheduler.exporter.channelType = tcp

  #quartz.scheduler.exporter.channelName = httpQuartz

 

  quartz_jobs.

  <?  <!-- This file contains job definitions in schema version 2.0 format -->
  <job-scheduling-data   <processing-directives>
    <overwrite-existing-data>true</overwrite-existing-data>
  </processing-directives>
  <schedule>
    <!--定义示例任务1 Job-->
    <job>
      <name>DemoJob1</name>
      <group>DeomJobGroup</group>
      <description>Quartz.Net示例任务1</description>
      <job-type>Quartz.Net.Jobs.DemoJob1,Quartz.Net.Jobs</job-type>
      <durable>true</durable>
      <recover>false</recover>
    </job>
    <!--定义示例任务2 Job-->
    <job>
      <name>DemoJob2</name>
      <group>DeomJobGroup</group>
      <description>Quartz.Net示例任务2</description>
      <job-type>Quartz.Net.Jobs.DemoJob2,Quartz.Net.Jobs</job-type>
      <durable>true</durable>
      <recover>false</recover>
    </job>
    <!--定义示例任务1 触发器 每30秒执行一次DemoJob1任务-->
    <trigger>
      <cron>
        <name>DemoJob1Trigger</name>
        <group>DeomJobTriggerGroup</group>
        <job-name>DemoJob1</job-name>
        <job-group>DeomJobGroup</job-group>
        <cron-expression>0/30 * * * * ?</cron-expression>
      </cron>
    </trigger>
    <!--定义示例任务2 触发器 每分钟执行一次DemoJob2任务-->
    <trigger>
      <cron>
        <name>DemoJob2Trigger1</name>
        <group>DeomJobTriggerGroup</group>
        <job-name>DemoJob2</job-name>
        <job-group>DeomJobGroup</job-group>
        <cron-expression>0 * * * * ?</cron-expression>
      </cron>
    </trigger>
    <!--定义示例任务2 触发器 每天凌晨01:00执行一次DemoJob2任务-->
    <trigger>
      <cron>
        <name>DemoJob2Trigger2</name>
        <group>DeomJobTriggerGroup</group>
        <job-name>DemoJob2</job-name>
        <job-group>DeomJobGroup</job-group>
        <cron-expression>0 0 1 * * ?</cron-expression>
             </cron>
    </trigger>
  </schedule>
  </job-scheduling-data>

 

  第四步:宿主程序,可以是window服务,也可以是后台Console程序,如何用Topshelf来创建我们的window服务,请看另外一篇文章《使用Topshelf 开发windows服务》。

  namespace Quartz.Net.Console
  {
    class Program
    {
      private static IScheduler scheduler;
      static void Main(string[] args)
      {
        ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
        scheduler = schedulerFactory.GetScheduler();

        scheduler.Start();
      }
    }
  }

 

  运行后,效果如下图: