Quartz.NET總結(六)了解Jobs 和 Triggers


前面講了一些Quartz.net 的一些東西, http://www.cnblogs.com/zhangweizhong/category/771057.html

但是發現有一些基礎的東西,沒有說到。Quartz.net 里面一些個基本的元素,比如Jobs,Triggers等。

Quartz API 的接口和類主要有:

  1. IScheduler - scheduler調度的主要接口api
  2. IJob - scheduler調度執行job需要實現的接口api
  3. IJobDetail - 用來定義jobs的實例
  4. ITrigger - 定義需要執行的job的調度構成
  5. JobBuilder - 用於定義/創建job的明細情況,定義job的實例
  6. TriggerBuilder - 用於定義/創建Trigger的實例

一個Scheduler調度的生命周期從開始創建,到結束關閉,都是通過SchedulerFactory 實現的。當我們創建了IScheduler接口后,我們就可以用來add、remove、或者list jobs和triggers,或者是其他與調度相關的工作。

Scheduler 調度的方法有:

  1. WithCalendarIntervalSchedule
  2. WithCronSchedule
  3. WithDailyTimeIntervalSchedule
  4. WithSimpleSchedule

使用DateBuilder可以輕松的構建特定的執行時間點等,如下個小時、十點鍾、或者是其他的具體時間方式。

Jobs and Triggers

定義一個job必須實現了IJob接口,如下為IJob接口的方法:

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

當 Job的trigger被觸發后,scheduler調度的線程 就會執行 Execute 方法,同時 JobExecutionContext 包含運行環境參數等信息也會傳遞給execute方法。

比如說:job可以創建並存儲在獨立的scheduler調度中並由Trigger觸發,不同的Trigger觸發器可以觸發相同的job任務。這種松耦合能夠保證如果Job的觸發規則變了,不用去該job,而只需修改某個Trigger的觸發規則。同時,配置在scheduler調度中的job任務任然是可以被其他觸發器使用,而不需要我們重新定義新的job任務。

接下來需要我們了解知道的job深入內容主要有IJob接口的Execute()方法和JobDetails。

對於一個job任務來說,我們知道如何制定特定type類型和如何編寫實現一個job的代碼,對於使用Quartz.NET來說我們需要了解它各種各樣的屬性參數,可以通過job的JobDetail明細類來進行分析。

JobDetail明細類的實例是通過JobBuilder創建的,JobBuilder允許我們使用連續的接口方式進行實現和編碼。

        // 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);

接下來定義一個job實現類HelloJob:

    public class HelloJob : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            Console.WriteLine("HelloJob is executing.");
        }
    }

說到這里,有些 job任務是需要設置一些屬性或者參數的 ,怎么給運行中的Job賦值呢? JobDataMap 提供了這方面的實現,也就是在 JobDetail對象中,設置job需要的值或參數。

JobDataMap

JobDataMap可以存儲容納任意數量的可序列化對象,以便在job實例化執行的時候使用。JobDataMap是IDictionary接口的實現,並添加了一些方便存儲和檢索原始類型數據的方法。

下面演示一小段代碼來說明將job任務添加到scheduler調度前先將數據添加到JobDataMap:

Setting Values in a JobDataMap

  // define the job and tie it to our DumbJob class
            IJobDetail job = JobBuilder.Create<DumbJob>()
               .WithIdentity("myJob", "group1") // name "myJob", group "group1"
                  .UsingJobData("jobSays", "Hello World!")
               .UsingJobData("myFloatValue", 3.141f)
               .Build();

下面演示下job任務執行時候從JobDataMap中取出數據的代碼片段:

Getting Values from a JobDataMap

  public class DumbJob : IJob
    {
        public void Execute(JobExecutionContext context)
        {
            JobKey key = context.JobDetail.Key;

            JobDataMap dataMap = context.JobDetail.JobDataMap;

            string jobSays = dataMap.GetString("jobSays");
            float myFloatValue = dataMap.GetFloat("myFloatValue");

            Console.Error.WriteLine("Instance " + key + " of DumbJob says: " + jobSays + ", and val is: " + myFloatValue);
        }
    }

有了JobDataMaps Job在執行的過程中,就可以取出需要的相關參數。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM