麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Quartz.NET總結(jié)(一)入門

2019-11-14 13:54:08
字體:
供稿:網(wǎng)友

  前段時間,花了大量的時間,將原先的計劃任務(wù),切換到Quartz.NET來進(jìn)行管理。原先的后臺定時服務(wù)都是通過計劃任務(wù)來實現(xiàn)的,但是隨著業(yè)務(wù)增長,計劃任務(wù)也越來越多,每個后臺服務(wù),都得創(chuàng)建一個計劃任務(wù)。日常的維護(hù)和管理非常麻煩。

 

  于是乎,一咬牙,決定引入Quartz.NET框架,統(tǒng)一都管理全部的后臺定時服務(wù)。切換過程確實很麻煩。直到今天,才終于有時間整理總結(jié)Quartz.NET的相關(guān)內(nèi)容。

 

  Quartz.NET的優(yōu)點和使用場景,這里不再多說,網(wǎng)上有很多說明,總的來說就是,Quartz.NET是一個開源的作業(yè)調(diào)度框架,非常適合在平時的工作中,定時輪詢數(shù)據(jù)庫同步,定時郵件通知,定時處理數(shù)據(jù)等。 Quartz.NET允許開發(fā)人員根據(jù)時間間隔(或天)來調(diào)度作業(yè)。它實現(xiàn)了作業(yè)和觸發(fā)器的多對多關(guān)系,還能把多個作業(yè)與不同的觸發(fā)器關(guān)聯(lián),配置靈活方便。

 

  參考官方學(xué)習(xí)文檔:http://www.quartz-scheduler.net/documentation/index.html

  快速搭建一個Quartz,源代碼下載

 

  第一步:新建解決方案和相關(guān)項目,并安裝相關(guān)程序包,如下圖所示:

      

        Quartz依賴Common.Logging和Common.Logging.Log4Net,而且Log4Net也是比較熟悉的日志工具,因此我們實際使用中,也是log4net記錄日志,另外定時作業(yè)一般都是在window服務(wù)中,我們也可用Topshelf來創(chuàng)建我們的window服務(wù)。

 

  第二步:創(chuàng)建兩個Job類Job1,Job2。實現(xiàn)IJob,在Execute方法里編寫要處理的業(yè)務(wù)邏輯,系統(tǒng)就會按照Quartz的配置,定時處理。

  using System;

  using System.Threading;
  namespace Quartz.Net.Jobs
  {
    /// <summary>
    /// 實現(xiàn)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 任務(wù)運(yùn)行開始");

          for (int i = 0; i < 5; i++)
          {

            Thread.Sleep(100);
            logger.InfoFormat("Job1 正在運(yùn)行{0}", i);
          }

          logger.Info("Job1任務(wù)運(yùn)行結(jié)束");
        }
        catch (Exception ex)
        {
          logger.Error("Job1 運(yùn)行異常", ex);
        }

      }
    }
  }

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

  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

  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

  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 觸發(fā)器 每30秒執(zhí)行一次Job1任務(wù)-->
    <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 觸發(fā)器 每分鐘執(zhí)行一次Job2任務(wù)-->
    <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服務(wù),也可以是后臺Console程序,如何用Topshelf來創(chuàng)建我們的window服務(wù),請看另外一篇文章《使用Topshelf 開發(fā)windows服務(wù)》。

  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這兩個文件,要手動復(fù)制到輸出目錄下,或者在vs中,分別選中這兩個文件→右鍵屬性→復(fù)制到輸入目錄設(shè)為:始終復(fù)制。

  否則讀取不到這兩個配置文件,程序無法運(yùn)行。

  運(yùn)行后,效果如下圖:  

      

 


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 日本在线高清 | 国产精品刺激对白麻豆99 | 午夜精品视频免费观看 | 粉嫩一区 | 九九热在线视频免费观看 | 国产成年人小视频 | 最近中文字幕一区二区 | 日本网站一区 | 久久精品视频免费观看 | 石原莉奈日韩一区二区三区 | 国产精品久久久麻豆 | 视频一区 日韩 | 精品一区二区6 | 久久成人免费观看 | 一级黄色影院 | 国产成人精品区一区二区不卡 | 黄色毛片a级 | 激情小说另类 | 国产精品视频一区二区三区四 | 日韩欧美高清片 | 久久毛片 | 在线成人看片 | 精品久久一区二区三区 | 国产午夜精品久久久久久久蜜臀 | 国产精品一区二区在线 | 9999久久久久久 | 特级黄aaaaaaaaa毛片 | 特级毛片免费视频 | 久久国产精品二国产精品中国洋人 | 俄罗斯16一20sex牲色另类 | 久久久久九九九女人毛片 | 一级毛片电影院 | 国产乱淫av一区二区三区 | 亚洲一区久久久 | 嗯哈~不行好大h双性 | 久久亚洲综合色 | 综合精品久久 | 深夜福利久久久 | 精品国产一区二区亚洲人成毛片 | 欧美人一级淫片a免费播放 久久久久久久久91 国产99久久久久久免费看 | 亚洲视频精选 |