(02) 任務(Jobs)和觸發器(Triggers)

来源:http://www.cnblogs.com/gb2013/archive/2016/08/27/quartz-jobs-and-triggers.html
-Advertisement-
Play Games

Quart 的 API Quartz API 中的關鍵介面和類如下: IScheduler—與調度器(scheduler)進行交互的主要 API; IJob—被組件繼承和實現,由調度器來執行的介面; IJobDetail—通常被用於定義任務實例; ITrigger—對於給定的任務定義出了它將被執行的... ...


Quart 的 API

Quartz API 中的關鍵介面和類如下:

  • IScheduler—與調度器(scheduler)進行交互的主要 API;
  • IJob—被組件繼承和實現,由調度器來執行的介面;
  • IJobDetail—通常被用於定義任務實例;
  • ITrigger—對於給定的任務定義出了它將被執行的時間序列的組件;
  • JobBuilder—通常用來定義(或創建) JobDetail 實例,此實例用於定義任務實例;
  • TriggerBuilder—通常用來定義(或創建)觸發器實例。

在本教程中,為了提高可讀性以下術語交替使用:IScheduler 和 Scheduler,IJob 和 Job,IJobDetail 和 JobDetail,ITrigger 和 Trigger。

調度器創建後的生命周期是有限的,通過調用調度工廠 (SchedulerFactory) 的 Shutdown() 方法可以關閉調度器。IScheduler 介面創建後即可進行任務和觸發器的添加、刪除以及列表操作,並且可以執行調度計劃相關的其他操作 (例如暫停一個觸發器)。然而,就像在《使用Quartz》中所講的那樣,只有在調用 Start() 方法之後調度器才會真正對觸發器起作用 (執行任務)。

Quartz 提供的 “builder” 類定義了一種領域專用語言 (DSL,也經常指代“流介面”)。在上一節中已經看到了它的例子,現在我們把它展示在下麵:

// define the job and tie it to our HelloJob class
IJobDetail job = JobBuilder.Create<HelloJob>()
    .WithIdentity("myJob", "group1") // name "myJob", group "group1"
    .Build();
   
// Trigger the job to run now, and then every 40 seconds
ITrigger trigger = TriggerBuilder.Create()
    .WithIdentity("myTrigger", "group1")
    .StartNow()
    .WithSimpleSchedule(x => x
        .WithIntervalInSeconds(40)
        .RepeatForever())           
    .Build();
   
// Tell quartz to schedule the job using our trigger
sched.scheduleJob(job, trigger);

上面的代碼塊展示了使用 JobBuilder 創建任務的定義並使用流介面創建了任務 (IJobDetail)。同樣,使用針對給定觸發器類型的 TriggerBuilder 的流介面和擴展方法創建了觸發器。可能的時間計劃擴展方法如下:

  • WithCalendarIntervalSchedule
  • WithCronSchedule
  • WithDailyTimeIntervalSchedule
  • WithSimpleSchedule

DateBuilder 類包含的很多方法可以讓我們很容易地構造特定時間點的 DateTimeOffset 實例 (例如代表下一個偶數小時的時間,換句話說就是如果現在是 9:43:27 那麼它將返回 10:00:00)。

任務和觸發器

任務就是實現了 IJob 的類,裡面只有一個簡單的方法:

IJob 介面:

namespace Quartz
{
    public interface IJob
    {
        void Execute(JobExecutionContext context);
    }
}

當任務的觸發器觸發以後,調度器的一個工作線程將會調用 Execute(..) 方法。傳遞到這個方法的 JobExecutionContext 對象提供了一個任務實例,這個實例包含以下運行時環境:一個運行當前任務的調度器的句柄,觸發當前任務的觸發器的句柄,當前任務的 JobDetail 對象,以及其他幾個對象。

調度器載入任務後 Quartz.NET 的客戶端 (即我們的應用程式) 會創建 JobDetail 對象。這個對象包含了任務的各種屬性設置,以及一個 JobDataMap——它可以用來存儲指定任務類型的狀態信息。JobDetail 是任務對象的本質,我們會在下一節更詳細地討論它。

觸發器用來觸發 (或者叫“點火”) 任務的執行操作。當你想要調度一個任務的時候,你需要初始化一個觸發器並按照你想要的調度計劃來調整它的屬性。觸發器也可能有一個關聯的 JobDataMap,這對於向觸發器觸發操作指定的任務傳遞參數來說很有用。Quartz 附帶了一些不同的觸發器類型,但是通常情況下用的最多的是SimpleTrigger(介面是ISimpleTrigger) 以及 CronTrigger(介面是ICronTrigger)。

如果你需要在指定時間點僅執行一次,或者在指定時間內重覆多次並且在每執行前延遲特定時間的任務,使用SimpleTrigger將會很方便。如果你想讓觸發器有類似於日曆的調度計劃,CronTrigger將會很合適,例如“每周五下午”或者“每個月第10天的10:15”。

為什麼要有任務和觸發器?很多任務調試工具都沒有將觸發器和任務的概念分離。一些組件簡單地將任務當作附帶一點任務標識的執行時間(或者計劃)。還有一些組件很像是Quartz的任務和觸發器的結合。但是當我們開發Quartz時, 我們決定將調度計劃和在調度計劃內將要執行的操作分離開。在我們看來這樣做有很多好處。

例如:任務可以獨立於觸發器創建並存儲到任務調度器中,並且可以將多個觸發器關聯到同一個任務上。另一個松耦合的好處是對於調度器中保留的任務,當與之關聯的觸發器過期之後,可以不用重新定義這個任務就對它再次進行調度安排;同樣的你也可以修改或替換一個觸發器而不用重新定義與它關聯的任務。

標識

當任務和觸發器在Quartz的調度器中註冊時就分配了標識主鍵。任務和觸發器的主鍵(JobKey 和TriggerKey)對於將其組織歸併到某個分組併進行分類是非常有用的,例如將任務分為“報表任務”或“維護任務”。組內的任務或觸發器的主鍵名稱不能重覆,換句話說即任務或觸發器的名稱以及組名結合在一起就是完整主鍵(或者標識)。

原文:《Lesson 2: Jobs And Triggers》


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

-Advertisement-
Play Games
更多相關文章
  • 在很多項目裡面,對條形碼和二維碼的生成和列印也是一種很常見的操作,在Web項目裡面,我們可以利用JS生成條形碼和二維碼的組件有很多。本文引入兩個比較廣泛使用的JS組件,用來處理條形碼和二維碼的生成處理,並介紹如何利用CLODOP組件實現內容的列印輸出。生成條形碼使用組件JsBarcode,生成二維碼... ...
  • 現在需要匹配 [color=#000000],以"[color"開頭,以"[/color]"結束,中間字元數量不限制,最後返回所有匹配的下標。 代碼如下: ...
  • 在上篇隨筆《基於Metronic的Bootstrap開發框架經驗總結(12)--頁面鏈接收藏夾功能的實現》上,我介紹了鏈接收藏夾功能的實現,以及對收藏記錄的排序處理。該篇隨筆主要使用功能按鈕的方式移動收藏記錄,功能雖然實現的還算不錯,不過文章出來後,有讀者同行指出可以利用直接拖動的方式實現排序更方便... ...
  • Linq To Objects - 如何操作字元串 開篇語: 上次發佈的 《LINQ:進階 - LINQ 標準查詢操作概述》(90+贊) 社會反響不錯,但自己卻始終覺得缺點什麼!“紙上得來終覺淺,絕知此事要躬行”,沒錯,就是實戰!這次讓我們一起來看看一些操作字元串的技巧,也許能引我們從不同的角度思考 ...
  • 1.建立級聯刪除 Mr.E的級聯刪除並非資料庫自帶那個級聯刪除,而是Mr.E自帶的,所以它能觸發你C#裡面編寫的觸發器。 首先,建立級聯刪除關係,如下圖有兩個表,UserInfo和UserDocument, UserDocument表依靠UserID欄位,和UserInfo聯繫起來。現在我要實現,當 ...
  • 今天閑著沒事,研究了一下線上更新程式版本的問題。也是工作中的需要,開始不知道如何下手,各種百度也沒有找到自己想要的,因為我的需求比較簡單,所以就自己琢磨了一下。講講我的需求吧。自己在IIs上發佈了一個網站,這個網站僅僅只是內部使用的,網站的內容就是我的另外一個程式(就叫A程式吧)的打包發佈的文件放進 ...
  • 《C#基礎知識鞏固》 一、特性是什麼東東 二、什麼是反射、反射可以做些什麼 三、依賴註入是什麼 四、可空類型Nullable<T>到底是什麼鬼 五、談擴展方法的理解 六、你必須知道的EF知識和經驗【推薦】 七、你知道C#中的Lambda表達式的演化過程嗎 八、Linq表達式、Lambda表達式你更喜 ...
  • 註:本組件適用於.net2.0+的winform項目 樣子: 實際效果比這gif順滑,建議下載文末的Tester體驗 介紹: 如圖所見,這種提示在網頁、手機上用的較多,相比正經的消息框(如MessageBox),我認為好處有: 不需要用戶對消息本身做出響應,點啥【確定】什麼的 不阻塞、不幹預用戶的後 ...
一周排行
    -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# ...