zoukankan      html  css  js  c++  java
  • Quartz.NET总结(一)

     Quartz.NET总结(一)

          本文来源:http://www.cnblogs.com/zhangweizhong/p/4874396.html 

         前段时间,花了大量的时间,将原先的计划任务,切换到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服务。

           //我个人感觉还是使用Topshelf好些。

         安装程序包:

    • Install-Package Quartz
    • Install-Package Common.Logging.Log4Net1211
    • install-package Log4Net
    • install-package Topshelf -version 3.3.0
    • install-package Topshelf.Log4Net -version 3.3.0

      第二步:创建两个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 = 0; i < 5; i++)
              {
    
                Thread.Sleep(100);
                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 = 10
    
      quartz.threadPool.threadPriority = Normal
    
      # job initialization plugin handles our xml reading, without it defaults are used

    #注意:可以配置多个Job.xml,实现多个不同的job一起运行。
    quartz.plugin.xml.fileNames = ~/quartz_jobs.xml,~/quartz_jobs_two.xml
    
      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 = 555
    
      #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>0/30 * * * * ?</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>0 * * * * ?</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中,分别选中这两个文件→右键属性→复制到输入目录设为:始终复制。

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

      运行后,效果如下图:  

          

     

  • 相关阅读:
    路由器欺骗(原始套接字五)
    ICMP拒绝服务攻击(原始套接字系列四)
    ping的实现(原始套接字系列三)
    原始套接字基础(原始套接字系列二)
    原始套接字简介(原始套接字系列一)
    MMS服务学习
    转 Qt 翻译
    为应用程序设置一个图标 (窗口左上角 程序图标)
    正则表达式
    《TCP/IP详解 卷1:协议》第4章 ARP:地址解析协议
  • 原文地址:https://www.cnblogs.com/Blogs-Wang/p/6289961.html
Copyright © 2011-2022 走看看