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

Job和JobDetails的关系

 

接一篇的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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变量输出到控制台

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;方法,直接使用该属性在控制台输出字符串,也可以得到一样的效果,而且代码看起来更加简洁

1
2
3
4
5
6
7
8
9
10
11
12
13
public string MyName { get; set; }
 
  
 
public void Execute(IJobExecutionContext context)
 
{
 
     Console.WriteLine($"Hello {MyName}");
 
     Console.WriteLine("Hello World.");
 
}

 

 

posted @   LamondLu  阅读(417)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示
主题色彩