採用config方式靈活配置我們的Quarz.net中的Job,Trigger

来源:http://www.cnblogs.com/huangxincheng/archive/2017/05/16/6859725.html
-Advertisement-
Play Games

經常在項目中遇到定時任務的時候,通常第一個想到的是Timer定時器,但是這玩意功能太弱雞,實際上通常採用的是專業化的第三方調度框架,比如說 Quartz,它具有功能強大和應用的靈活性,我想使用過的人都非常瞭解,那麼本篇就來說說如何通過代碼和配置文件來進行job和trigger的配置。 一:常規的jo ...


  經常在項目中遇到定時任務的時候,通常第一個想到的是Timer定時器,但是這玩意功能太弱雞,實際上通常採用的是專業化的第三方調度框架,比如說

Quartz,它具有功能強大和應用的靈活性,我想使用過的人都非常瞭解,那麼本篇就來說說如何通過代碼和配置文件來進行job和trigger的配置。

 

一:常規的job,trigger配置方式

    這種常規的方式也是我們初步學習Quartz最先瞭解到的,即通過JobBuilder和TriggerBuilder來鏈式一個IJobDetail和ISimpleTrigger,比如下麵的代碼。

 1  class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
 6 
 7             scheduler.Start();
 8 
 9             var job = JobBuilder.Create<HelloJob>().Build();
10 
11             var trigger = TriggerBuilder.Create().WithSimpleSchedule(m => m.WithIntervalInSeconds(1)
12                                                                             .RepeatForever())
13                                                  .StartNow()
14                                                  .Build();
15 
16             scheduler.ScheduleJob(job, trigger);
17 
18             Console.Read();
19         }
20     }

   

     上面這段代碼可以看出,在BuildJob的時候,使用提供的HelloJob作為當前的定時調度的任務,下麵的ISimpleTrigger的意思就是每一秒鐘執行一次HelloJob,

僅此而已,然後就是HelloJob的具體定義,非常簡單,實現一個IJob介面。

1     public class HelloJob : IJob
2     {
3         private string name = string.Empty;
4         public void Execute(IJobExecutionContext context)
5         {
6             Console.WriteLine("當前時間: {0} ", DateTime.Now);
7         }
8     }

 

    然後可以把程式跑起來,看看最後的一個結果,可以看到每秒鐘都有一個數據輸出:

 

     這種方式貌似很完美,但是也有一個不利點,現在需求有變更,我需要將WithIntervalInSeconds(1) 改成WithIntervalInSeconds(2),也就是每秒執行

一次改成每兩秒執行一次,這個就頭疼了,你不得不面對改一次需求,就需要編譯一次再發佈,這樣的傷筋動骨,我想你也不大願意吧?面對這種需求肯定是

有辦法的,不信的話,你可以往下看。

 

二:在quartz_jobs.xml定義job和trigger

    上面這種硬編碼帶來的壞處我也跟大家講到了,接下來看看如何使用xml配置job和trigger,當我們從nuget中獲取quartz框架的時候,應該都會發現你的

解決方案中多了一個xsd文件,但是可能有很多人並不知道這個xsd文件到底是用來幹嘛的。。。。其實就是用來寫xml時做代碼提示用的,好了,下麵我就一

步步的展示給大家。

 

1. 從nuget下載文件,沒什麼好說的,在“引用”上右擊滑鼠,選擇“管理NuGet程式包”看下圖:

 

然後你會看到多了一個job_scheduling_data_2_0.xsd文件。

 

2.  接下來新建一個quartz_jobs.xml文件,然後選中visual studio中的xml菜單欄,選中“架構”菜單項。

 

3. 在彈出的對話框中,選擇“添加”按鈕,找到從nuget中生成的job_scheduling_data_2_0.xsd,然後點擊完成。

 

4. 然後就可以在xml中自由的編碼,你會發現關於job和trigger的代碼有提示了。。。這極大的提高了我們的開發

    效率,對吧。

 

好了,下麵貼出完整的xml案例,從xml中大概也能看得出來,在schedule中定義了一個job和trigger,在job-type節點中定義了需要執行job的命名空間和類名,

有點意思吧,也是最終schedule需要調度的任務。

<?xml version="1.0" encoding="utf-8" ?>
<job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData">
  <processing-directives>
    <overwrite-existing-data>true</overwrite-existing-data>
  </processing-directives>

  <schedule>
    <job>
      <name>sampleJob</name>
      <group>sampleGroup</group>
      <description>Sample job for Quartz Server</description>
      <job-type>ConsoleApplication5.HelloJob,ConsoleApplication5</job-type>
      <durable>true</durable>
      <recover>false</recover>
    </job>
    <trigger>
      <simple>
        <name>sampleSimpleTrigger</name>
        <group>sampleSimpleGroup</group>
        <description>Simple trigger to simply fire sample job</description>
        <job-name>sampleJob</job-name>
        <job-group>sampleGroup</job-group>
        <misfire-instruction>SmartPolicy</misfire-instruction>
        <repeat-count>-1</repeat-count>
        <repeat-interval>1000</repeat-interval>
      </simple>
    </trigger>
  </schedule>
</job-scheduling-data>

 

5. job的配置文件基本上算是搞定了,然後配置Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin類來處理

這個xml文件,同時指定下quartz_jobs.xml的路徑,如下所示:

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             var factory = new StdSchedulerFactory(new System.Collections.Specialized.NameValueCollection()
 6                 {
 7                     {"quartz.plugin.xml.fileNames","~/quartz_jobs.xml" },
 8                     {"quartz.plugin.xml.type","Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin,Quartz"}
 9                 });
10 
11             IScheduler scheduler = factory.GetScheduler();
12 
13             scheduler.Start();
14         }
15     }

 

好了,基本上就這樣配置結束了,最後一點要註意的就是配置一下quartz_jobs.xml始終複製到bin文件下,如圖:

 

最後跑一下源代碼看看,效果咋樣,看到沒有,是不是很牛逼。

 

好了,現在是不是發現你的靈活性有很大提高了,如果將1s改成2s,我只需要把quartz_jobs.xml中的<repeat-interval>1000</repeat-interval>,改成

<repeat-interval>2000</repeat-interval>就可是做到對trigger的動態配置,是不是很酷。

 

最後附完整案例:ConsoleApplication5.zip

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • a.場景: 平時會使用百度網盤下載電影,但是用ios版的百度雲實在是有點慢,而平時不用windows,因此只能在linux上尋找解決之道. b.背景(我正在使用中): linux:ubuntu 14.04 64bit 瀏覽器:firefox41.0.2 c.安裝詳情: 1.安裝火狐插件flashgo ...
  • 摘 要:本文闡述了MySQL DDL 的問題現狀、pt-online-schema-change的工作原理,並實際利用pt-online-schema-change工具線上修改生產環境下1.6億級數據表結構。 在一個軟體生命周期中,我們都知道,前期的表結構設計是非常重要的,因為當表數據量一上來後再進 ...
  • 一.檢查和安裝與Perl相關的模塊 PT工具是使用Perl語言編寫和執行的,所以需要系統中有Perl環境。 依賴包檢查命令為: rpm -qa perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL 如果有依賴包確實,可以使用下麵的命令安 ...
  • 要瞭解cgroup實現原理,必須先瞭解下vfs(虛擬文件系統).因為cgroup通過vfs向用戶層提供介面,用戶層通過掛載,創建目錄,讀寫文件的方式與cgroup交互. ...
  • 多個獨立的rtf文件合併時,如果文件紙張方向存在橫向 縱向不一致時,文件之間需要插入分節符 開始文件去掉最後一個"}",中間文件去掉第一個"{"及最後一個"}",最後一個去掉第一個"{";文件如存在紙張方向不一致則需要在兩個文件之間插入分節符。 參考:http://www.aiuxian.com/a ...
  • 系統有些埠是我們平時用不到但是又存在危險的埠,例如139、135、445等埠,windows預設是開著的,這時我們可以手動關閉這些埠!下邊為大家介紹一種通過windows組策略來一次性關閉所有想要關閉的危險埠 系統有些埠是我們平時用不到但是又存在危險的埠,例如139、135、445等端 ...
  • 一.並行LINQ System.Linq名稱空間中包含的類ParallelEnumerable可以分解查詢的工作,使其分佈在多個線程上。 儘管Enumerable類給IEnumerable<T>介面定義了擴展方法,但ParallelEnumerable類的大多數擴展方法是ParallerQuery< ...
  • 原文鏈接:http://blog.csdn.net/hebbers/article/details/70332015 關鍵點在與 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...