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

}

最新文章

  1. Lrc2srt精灵,增加自定义输出编码
  2. react native 学习资料整理
  3. mysql update中需要根据条件列更新写法update case
  4. 改变tabbar的高度做法
  5. Windows Phone 8.1SDK新特性预览
  6. IMP导入数据 报错 IMP-00058 ORA-01691 IMP-00028
  7. C#高性能大容量SOCKET并发(一):IOCP完成端口例子介绍(转)
  8. Android DownloadThread.run()学习
  9. 把程序嵌入网页之ATL编写ActiveX[标准窗口+接受参数]
  10. WebService-06-CXF与Spring集成
  11. 使用hibernate在5秒内插入11万条数据,你觉得可能吗?
  12. Alyona and copybooks
  13. ASP.NET Core 一步步搭建个人网站(7)_Linux系统移植
  14. box-sizing position
  15. 搭建IIS并配置网站之旅
  16. Weex开发中的应用小笔记
  17. shell 下生成使用UUID
  18. 【第一次作业】&amp;&amp;软件工程大一班---甘昀
  19. Java Scanner篇
  20. mongodb数据导入导出

热门文章

  1. Vue面试中,经常会被问到的面试题/Vue知识点整理
  2. Nginx upstream的5种权重分配方式分享
  3. MFC学习RepositionBars
  4. Y1O001波分复用器
  5. Hibernate HQL ②
  6. iphone 屏蔽系统自动更新,消除设置上的小红点
  7. 算法第四版中 while (!StdIn.isEmpty()) 循环无法跳出问题
  8. 在Linux上搭建测试环境常用命令(转自-测试小柚子)
  9. 面试题:int和Integer的区别
  10. vue的登陆验证及返回登录前页面实现