程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> (02) 任務(Jobs)和觸發器(Triggers),jobstriggers

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

編輯:C#入門知識

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


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》

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved