zoukankan      html  css  js  c++  java
  • 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在执行的过程中,就可以取出需要的相关参数。

     

  • 相关阅读:
    暂时转换
    内置函数⼆
    day13内置函数⼀
    day12⽣成器和⽣成器表达式
    20181031作业
    20181030函数2
    20181029函数1
    20181026
    20181025
    20181024
  • 原文地址:https://www.cnblogs.com/zhangweizhong/p/6653523.html
Copyright © 2011-2022 走看看