当前位置:网站首页>.Net Core 下使用 Quartz —— 【3】作业和触发器之作业传参
.Net Core 下使用 Quartz —— 【3】作业和触发器之作业传参
2022-04-23 05:55:00 【番茄大侠本尊】
目录
在上一篇中,我们简单了解了什么是作业和作业的上下文,以及作业唯一标识,接下来我们将继续了解作业的传参
1、作业的实例
在调度程序每次执行作业的Execute()方法之前,都会创建该作业新的实例
这就意味着:
1、我们编写的作业,必须具有无二义性的构造函数
2、在job类中定义数据字段是没有意义的,因为调度程序每次都创建新实例,不会维护这些字段。
2、JobDataMap
JobDataMap 可以提供可序列化的对象
。JobDataMap
是IDictionary
接口的实现,并具有一些用于存储和检索基本类型数据的便捷方法。
JobDataMap
中还有一些辅助方法,比如 GetKeys、Put 、GetInt 等等,这里不详细介绍了
我们修改之前创建 jobdetail 的代码, 使用 UsingJobData 增加一个 key是 "name" 值为 "zhangsan" 数据项
IJobDetail job = JobBuilder.Create<HelloJob>()
.WithIdentity("job1", "jobGroup1")
.UsingJobData("name","zhangsan")
.Build();
然后修改具体的 作业类,来接收我们的参数
public class HelloJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{
JobDataMap dataMap = context.JobDetail.JobDataMap;
string name = dataMap.GetString("name");
await Console.Out.WriteLineAsync($"{DateTime.Now}:{name}");
}
}
下面是输出结果:
注意:这种以字符串的形式直接写入参数并不友好,Quartz提示我们,如果我们使用了持久化数据的功能,那么很可能因为修改了参数的key而导致序列化问题,这里我们看一下官方给的示例的做法:
在job里定义参数常量
using System;
using System.Threading.Tasks;
namespace Quartz.Examples.Example04
{
public class ColorJob : IJob
{
public const string FavoriteColor = "favorite color";
public const string ExecutionCount = "count";
public virtual Task Execute(IJobExecutionContext context)
{
// Grab and print passed parameters
JobDataMap data = context.JobDetail.JobDataMap;
var favoriteColor = data.GetString(FavoriteColor);
int count = data.GetInt(ExecutionCount);
...
}
}
}
通过常量传值
IJobDetail job2 = JobBuilder.Create<ColorJob>()
.WithIdentity("job2", "group1")
.Build();
job2.JobDataMap.Put(ColorJob.FavoriteColor, "Red");
job2.JobDataMap.Put(ColorJob.ExecutionCount, 1);
当然,你也可以使用别的方法,比如自己编写类映射等等
3、用属性接收参数
如果您在作业类中添加了具有set访问器的属性,这些属性与JobDataMap中的键名称相对应,则Quartz的默认JobFactory实现将在实例化该作业时自动调用这些setter,避免了自己编写获取参数的代码部分。请注意,使用自定义JobFactory时,默认情况下不维护此功能。
我们修改HelloJob代码
public class HelloJob : IJob
{
public string Name { private get; set; }
public async Task Execute(IJobExecutionContext context)
{
JobDataMap dataMap = context.JobDetail.JobDataMap;
await Console.Out.WriteLineAsync($"{DateTime.Now}:{Name}");
}
}
注意属性名称开头大写,这里我使用小写无效
4、触发器参数
当我们需要同一个作业根据不同的触发器传递不同的参数时,这非常有用
触发器参数如果和作业参数同名,那将代替作业参数
//1、从工厂获取调度器实例
IScheduler scheduler = await _schedulerFactory.GetScheduler();
//2、开始调度
await scheduler.Start();
//3、定义作业并将其绑定到我们的HelloJob类,作业名为job1 作业组名jobGroup1
IJobDetail job = JobBuilder.Create<HelloJob>()
.WithIdentity("job1", "jobGroup1")
.UsingJobData("name","zhangsan")
.Build();
//4、创建一个立即执行的触发器,每间隔3秒触发一次,触发器名为trigger1,触发器组名triggerGroup1
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "triggerGroup1")
.StartNow()
.UsingJobData("name", "zhangsan")
.WithSimpleSchedule(x => x.WithIntervalInSeconds(3).RepeatForever())
.Build();
//5、创建第二个触发器,绑定给job
ITrigger trigger2 = TriggerBuilder.Create()
.WithIdentity("trigger2", "triggerGroup1")
.StartNow()
.UsingJobData("name", "lisi")
.WithSimpleSchedule(x => x.WithIntervalInSeconds(3).RepeatForever())
.ForJob(job)
.Build();
//6、将触发器与作业进行绑定
await scheduler.ScheduleJob(job,trigger);
await scheduler.ScheduleJob(trigger2);
从上面的代码可以看出,我们自己的作业实例中定义了 name 参数
并且在 两个触发器中也都定义了同名的 name 参数
下面是运行结果:
版权声明
本文为[番茄大侠本尊]所创,转载请带上原文链接,感谢
https://blog.csdn.net/Tomato2313/article/details/108992635
边栏推荐
- HDU-Tunnel Warfare
- Krypton zeal
- Header内置对象
- 几款笔记软件的优缺点
- Understanding of SSH public key and private key
- Sdoi2009-hh Necklace
- 导入文件时候 new FormData()
- var、let、const之间的区别
- The difference between single quotation mark, double quotation mark and back quotation mark in shell script
- Notes on advanced points of C language 4
猜你喜欢
随机推荐
查漏补缺(六)
Node的文件系统及Buffer概述
MOS管特性和导通过程
几款笔记软件的优缺点
Redux概述
监听除某元素之外点击事件
VHDL finite state machine (FSM) code example
.Net Core 下使用 Quartz —— 【7】作业和触发器之简单触发器
Navicat 连接 oracle library is not loaded的解决方法
FOC single resistance sampling position loop control servo motor
Special register C51 / C52
汇编基础代码示例
C语言 #和##的使用
C语言结构体指定初始化
手动实现call,apply,bind函数
Assembler 32-bit unsigned addition calculator
查漏补缺(二)
统计字符串中每个字符出现的次数
MOS tube characteristics and conduction process
JS的解析与执行过程