• Quartz.NET学习笔记(二) Job和JobDetails


    Job和JobDetails的关系

    接一篇的例子

    ISchedulerFactory schedFact = new StdSchedulerFactory();
    
    IScheduler sched = schedFact.GetScheduler();
    
    sched.Start();
    
     
    
    IJobDetail job = JobBuilder.Create<FirstJob>()
    
        .WithIdentity("myJob", "group1")
    
        .Build(); 
    
    ITrigger trigger = TriggerBuilder.Create()
    
        .WithIdentity("myTrigger", "group1")
    
        .StartNow()
    
        .Build();
    
     
    
    sched.ScheduleJob(job, trigger);

    Job和JobDetails是任务相关2个对象,所有的Job都实现了IJob接口,所有的JobDetails都实现了IJobDetails接口。

    Quartz.NET中,我们使用调用器Scheduler, 将一个JobDetails对象关联到一个触发器中,而非直接关联一个Job对象到触发器对象中。原因是Job只是定义任务需要做什么,而不包含任务执行时需要的运行环境, 如果一个Job和具体的运行环境绑定,就没有办法复用了。

    JobDetails包含了Job的所有运行环境,上面的实例代码中,我们使用JobBuilder类,来根据指定的Job类型,生成了一个对应的JobDetails。在JobDetails关联到触发器之后,触发器触发,JobDetails对象会自动进行以下操作

    1. 根据定义实例化一个对应的Job对象
    2. 为Job对象准备运行环境
    3. 执行Job对象的Execute方法

    Job的运行环境

    JobDetails如何为Job指定运行环境呢?

    查看IJobDetails接口的定义,我们可以看到一个名为JobDataMap的对象,这个对象会在Job实例化成功之后,填充具体的运行环境。

     

    下面我们修改一下我们当前的代码,首先修改一下program.cs

    ISchedulerFactory schedFact = new StdSchedulerFactory();
    
     
    
    IScheduler sched = schedFact.GetScheduler();
    
    sched.Start();
    
     
    
    IJobDetail job = JobBuilder.Create<FirstJob>()
    
        .UsingJobData("MyName", "Lunan")
    
        .WithIdentity("myJob", "group1")
    
        .Build();
    
     
    
    ITrigger trigger = TriggerBuilder.Create()
    
        .WithIdentity("myTrigger", "group1")
    
        .StartNow()
    
        .Build();
    
     
    
    sched.ScheduleJob(job, trigger);

    这里UsingJobData方法,会将录入的键值对,保存在JobDataMap中,Job运行的时候,可以从上下文对象中获取到这些添加的键值对。

    在这里调用多次UsingJobData方法可以录入多个键值对。

    下面我们继续修改一下FirstJob类, 我们希望任务执行的时候,将MyName变量输出到控制台

    public class FirstJob : IJob
    
    {
    
        public void Execute(IJobExecutionContext context)
    
        {
    
            JobDataMap dataMap = context.JobDetail.JobDataMap;
    
            Console.WriteLine($"Hello {dataMap.GetString("MyName")}");
    
            Console.WriteLine("Hello World.");  
    
        }
    
    }

    这里从运行上下文对象context可以从读取JobDataMap中定义的参数。

    查看效果

    我们重新运行程序,程序正确读出了参数MyName

    使用注入的方式接收参数

    Quartz.Net支持注入的方式传递参数,这里我们对上面的Job代码进行一下微小的调整,添加一个名为MyName的属性,提供get;set;方法,直接使用该属性在控制台输出字符串,也可以得到一样的效果,而且代码看起来更加简洁

    public string MyName { get; set; }
    
     
    
    public void Execute(IJobExecutionContext context)
    
    {
    
         Console.WriteLine($"Hello {MyName}");
    
         Console.WriteLine("Hello World.");
    
    }

  • 相关阅读:
    Understand Rails Authenticity Token
    正则表达式:数值及数值型字符串三位一组格式化
    ceph主要数据结构解析2-Rados.h文件
    遍历聚合对象中的元素——迭代器模式(三)
    ceph主要数据结构解析3-Ceph_fs.h文件
    linux crontab 定时命令
    mysql数据类型详解
    遍历聚合对象中的元素——迭代器模式(四)
    Eclipse自动插件依赖的一种配置解决方式
    php缓存小技巧
  • 原文地址:https://www.cnblogs.com/lwqlun/p/9095109.html
Copyright © 2020-2023  润新知