前段时间,花了大量的时间,将原先的计划任务,切换到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类Job1,Job2。实现IJob,在Execute方法里编写要处理的业务逻辑,系统就会按照Quartz的配置,定时处理。

  using System;

  using System.Threading;
  namespace Quartz.Net.Jobs
  {
    /// <summary>
    /// 实现IJob接口
    /// </summary>
    public class Job1 : 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("Job1 任务运行开始");           for (int i = ; i < ; i++)
          {             Thread.Sleep();
            logger.InfoFormat("Job1 正在运行{0}", i);
          }           logger.Info("Job1任务运行结束");
        }
        catch (Exception ex)
        {
          logger.Error("Job1 运行异常", ex);
        }       }
    }
  }

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

   Quartz 实例的基础配置: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 = 

  quartz.threadPool.threadPriority = Normal

  # job initialization plugin handles our xml reading, without it defaults are used

  quartz.plugin.xml.type = Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz

  quartz.plugin.xml.fileNames = ~/quartz_jobs.xml

  # export this server to remoting context

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

  #quartz.scheduler.exporter.port = 

  #quartz.scheduler.exporter.bindName = QuartzScheduler

  #quartz.scheduler.exporter.channelType = tcp

  #quartz.scheduler.exporter.channelName = httpQuartz

   各个Job 任务的配置 :quartz_jobs.xml

<?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>
    <!--定义Job1 Job-->
    <job>
      <name>Job1</name>
      <group>JobGroup</group>
      <description>Quartz Job1</description>
      <job-type>Quartz.Net.Jobs.Job1,Quartz.Net.Jobs</job-type>
      <durable>true</durable>
      <recover>false</recover>
    </job>
    <!--定义Job2 Job-->
    <job>
      <name>Job2</name>
      <group>JobGroup</group>
      <description>Quartz Job2</description>
      <job-type>Quartz.Net.Jobs.Job2,Quartz.Net.Jobs</job-type>
      <durable>true</durable>
      <recover>false</recover>
    </job>
    <!--定义Job1 触发器 每30秒执行一次Job1任务-->
    <trigger>
      <cron>
        <name>Job1Trigger</name>
        <group>JobTriggerGroup</group>
        <job-name>Job1</job-name>
        <job-group>JobGroup</job-group>
        <cron-expression>/ * * * * ?</cron-expression>
      </cron>
    </trigger>
    <!--定义Job2 触发器 每分钟执行一次Job2任务-->
    <trigger>
      <cron>
        <name>Job2Trigger1</name>
        <group>JobTriggerGroup</group>
        <job-name>Job2</job-name>
        <job-group>JobGroup</job-group>
        <cron-expression> * * * * ?</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();
      }
    }
  }

  注意:quartz_jobs.xml和quartz.config这两个文件,要手动复制到输出目录下,或者在vs中,分别选中这两个文件→右键属性→复制到输入目录设为:始终复制。

  否则读取不到这两个配置文件,程序无法运行。

  运行后,效果如下图:  

Quartz.NET总结(一)入门的更多相关文章

  1. Quartz.NET简介及入门指南

    Quartz.NET简介 Quartz.NET是一个功能完备的开源调度系统,从最小的应用到大规模的企业系统皆可适用. Quartz.NET是一个纯净的用C#语言编写的.NET类库,是对非常流行的JAV ...

  2. Quartz教程:快速入门

    原文链接 | 译文链接 | 翻译:nkcoder | 校对:方腾飞 本系列教程由quartz-2.2.x官方文档翻译.整理而来,希望给同样对quartz感兴趣的朋友一些参考和帮助,有任何不当或错误之处 ...

  3. Quartz(任务调度)- 入门学习

    参照:http://blog.csdn.net/szwangdf/article/details/6158646 1.自定义定时任务管理类 QuartzManager 参照大神基础上新增:1.添加jo ...

  4. quartz任务时间调度入门使用

    Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现. 作为一个优秀的开源调度框架,Quartz 具有以下特点: 强大的调度功能,例如支持丰富多样 ...

  5. Quartz.NET文档 入门教程

    概述 Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET允许开发人员根据时间间隔(或天)来调度作业.它实现了 ...

  6. quartz 任务时间调度入门使用

    这一小节主要是针对cronschedule用法进行讨论,首先讲一下cronschedule基础知识点: 一个cronschedule至少有6个字符(或者7个字符),空格作为间隔,比如 0 * * * ...

  7. 关于Quartz .NET(V3.0.7)的简要说明

    目录 0. 任务调度 1. Quartz .NET 1.1 基本概念 1.2 主要接口和对象 2. 使用示例 2.0 准备工作 2.1 每间隔一定时间间隔执行一次任务 2.3 某天的固定时间点执行任务 ...

  8. Quartz 入门详解

    Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运行十个,百个, ...

  9. Quartz应用实践入门案例二(基于java工程)

    在web应用程序中添加定时任务,Quartz的简单介绍可以参看博文<Quartz应用实践入门案例一(基于Web应用)> .其实一旦学会了如何应用开源框架就应该很容易将这中框架应用与自己的任 ...

  10. Quartz应用实践入门案例一(基于Web环境)

    Quartz是一个完全由java编写的开源作业调度框架,正是因为这个框架整合了许多额外的功能,所以在使用上就显得相当容易.只是需要简单的配置一下就能轻松的使用任务调度了.在Quartz中,真正执行的j ...

随机推荐

  1. iOS不得姐项目--pop框架的初次使用

    一.pop和Core Animation的区别 1.Core Animation的动画只能添加到layer上 2.pop的动画能添加到任何对象 3.pop的底层并非基于Core Animation,是 ...

  2. C++中的重载隐藏覆盖&&JAVA中的重载覆盖&&多态

    class 类继承默认是private, struct 默认继承是public C++中的隐藏: 只要派生类中出现和基类一样的函数名,基类中的函数就会被派生类中的函数给隐藏(如果派生类和基类中的函数名 ...

  3. safe RGB colors

    RGB是面向机器的一种颜色空间. 虽然它表示\(256 \times 256 \times 256\)种不同的颜色, 但在实际中, 大部分机器都只实现了256种颜色. 安全色(Safe RGB col ...

  4. 让编辑器支持word的复制黏贴,支持截屏的黏贴

    chrome有很多人性化的API,比如拖拽, 比如图片可以转化为base64等: 比如知乎上面的回复中可以直接黏贴图片,  就不需要手动点击图片上传按钮, 选择图片, 确认上传等等: 知乎参考地址:打 ...

  5. jquery 设置焦点

    function CheckForm() { var classLevel = $("#classLevel").val(); var re = /^[1-9][0-9]*$/; ...

  6. Spark 常用参数及调优

    spark streaming 调优的几个角度: 高效地利用集群资源减少批数据的处理时间 设置正确的批容量(size),使数据的处理速度能够赶上数据的接收速度 内存调优 Spark SQL 可以通过调 ...

  7. lottery概率问题

    问题:1~n编号的彩票,要买全,等概率条件下平均要买几张要求写出算法. 回答:已经买了m张时,买中剩下的概率为1-m/n,则要买的张数为1/(1-m/n)n=2,s=1+1/(1-1/2);n=3,s ...

  8. AJAX-初学AJAX本地环境配置

    1.前段时间学习headfirst AJAX,发现有些概念比较陌生,理解起来比较困难,等看完了半本的JavaScript高级程序设计,再回头看这本AJAX,发现轻松了很多,但是遇到了一个问题,AJAX ...

  9. centos虚拟机克隆

    vmware vsphere平台上克隆centos6 一.删掉/etc/udev/rules.d/70-persistent-net.rules文件 reboot 二.vim ifcfg-eth0 删 ...

  10. AngularJs $animate 让页面动起来

    $animate $animate服务提供了基本的DOM操作功能如在DOM里插入.移除和移动元素,以及添加和删除类.这个服务是ngAnimate的核心服务,为CSS和Javascript提供了高档次的 ...