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.");

}

Quartz.NET学习笔记(二) Job和JobDetails的更多相关文章

  1. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  2. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  3. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  4. JMX学习笔记(二)-Notification

    Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...

  5. java之jvm学习笔记二(类装载器的体系结构)

    java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...

  6. Java IO学习笔记二

    Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...

  7. 《SQL必知必会》学习笔记二)

    <SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...

  8. NumPy学习笔记 二

    NumPy学习笔记 二 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分 ...

  9. Learning ROS for Robotics Programming Second Edition学习笔记(二) indigo tools

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  10. Redis学习笔记二 (BitMap算法分析与BitCount语法)

    Redis学习笔记二 一.BitMap是什么 就是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身.我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省 ...

随机推荐

  1. SFTP服务的使用!!

    在Client端安装Xshell或者SecureCRT等具有SFTP文件传输功能的软件,在服务器端安装好SFTP服务并启动,就可以用SFTP传输文件了! from:   http://www.cnbl ...

  2. 源生API解析XML文档与dom4j解析XML文档

    一.XML语言 XML是一种可扩展的标记语言,是一种强类型的语言,类似HTML(超文本标记语言,是一种弱类型的语言).XML是一种通用的数据交换格式(关系型数据库),综上所诉:XML可以传输数据,也可 ...

  3. TensorFlow之多核GPU的并行运算

    tensorflow多GPU并行计算 TensorFlow可以利用GPU加速深度学习模型的训练过程,在这里介绍一下利用多个GPU或者机器时,TensorFlow是如何进行多GPU并行计算的. 首先,T ...

  4. Linux 查询服务数据

    1.  htop 可以时时查看 2. free -m 查看缓存

  5. C#语言struct结构体适用场景和注意事项

    在C#语言中struct结构体和class之间的区别主要是值类型和引用类型的区别,但实际上如果使用不当是非常要命的.从Win32时代过来的人对于struct一点不感觉陌生,但是却反而忽略了一些基本问题 ...

  6. pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)

    数据介绍 先随机生成一组数据: import pandas as pd import numpy as np state = ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'N ...

  7. Python第一部分--Python简介+第一个程序+Python2和Python3介绍 001-016

    一.Python起源 1.1 解释器(科普) 1.2Python的设计目标 1.3 Python的设计哲学 02.为什么学Python? 代码量少 同一样问题,不用的语言解决,代码量差距还是很多的,一 ...

  8. imagecreatefrombmp、imagebmp php处理bmp文件

    /*格式组成典型的BMP图像文件由四部分组成: 1:位图头文件数据结构,它包含BMP图像文件的类型.显示内容等信息: 2:位图信息数据结构,它包含有BMP图像的宽.高.压缩方法,以及定义颜色等信息: ...

  9. django restframework

    一.django restframework 请求流程源码剖析 上面的认证一个流程是rest_framework的关于APIauth的认证流程,,这个流程试用权限.频率.版本.认证.这个四个组件都是通 ...

  10. Nginx如何进行配置优化?

    在日常工作的时候,搭建配置Nginx的时候,我们都会做相应的优化,那一般需要做的配置优化有哪些呢?可能有些小伙伴一听到要进行优化,内心难免有些慌. 今天咱们聊聊Nginx进行常规配置优化,这里需要注意 ...