Quartz.Net介绍及与.Net Core简单集成
Quartz.Net
是一个功能丰富、开源的作业调度系统,是著名JAVA开源项目Quartz在.Net中的实现,用于管理平常项目中常见的定时邮件、定时采集、定时通知等功能的一个作业调度框架。
Quartz.Net
官网: https://www.quartz-scheduler.net/
Cron
表达式在线生成: http://cron.qqe2.com/
Quartz三大对象
- IScheduler 单元 ,一个调度单元,在此上配置任务
- IJobDetail 作业,即具体做什么事情
- ITrigger 策略,即怎样执行作业
.Net Core集成Quartz
了解了Quartz.Net
三大对象后,集成也就变得简单了,大致分五个步骤。
第一步 nuget安装
Install-Package Quartz
第二步 创建调度单元
var factory = new StdSchedulerFactory(); var scheduler = await factory.GetScheduler();
第三步 指定具体作业
首先创建类
SendEmailJob
继承自IJob
,然后使用JobBuilder进行绑定并创建IJobDetail
。var jobDetail = JobBuilder.Create<SendEmailJob>() .WithIdentify("sendEmailJob","group1") .WithDescription("发送邮件作业") .Build();
第四步 创建任务策略
var trigger = TriggerBuilder.Create() .WithIdentify("sendEmailTrigger","group1") .WithCronSchedule("5/5 * * * * ?") .WithDescription("发送邮件策略") .Build();
第五步 开启任务
将三大对象进行绑定,然后开启任务。
await scheduler.ScheduleJob(jobDetail,trigger); await scheduler.Start();
初始化配置
NameValueCollection props = new NameValueCollection
{
{ "quartz.serializer.type", "binary" },
{ "quartz.scheduler.instanceName", "MyScheduler" },
{ "quartz.jobStore.type", "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" },
{ "quartz.jobStore.driverDelegateType", "Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz" },
{ "quartz.jobStore.tablePrefix", "QRTZ_" },
{ "quartz.jobStore.dataSource", "myDS" },
{ "quartz.dataSource.myDS.connectionString", "Data Source=EDG2GYKVF8G5P6Z;Initial Catalog=Quartz;User ID=sa;Password=password;" },
{ "quartz.dataSource.myDS.provider", "SqlServer" },
{ "quartz.threadPool.threadCount", "3" },
{ "quartz.scheduler.instanceId", "AUTO" },
{ "quartz.jobStore.clustered", "true" },
};
数据传递
所谓数据传递,是将数据传递进具体Job中,我们可以利用IJobDetail
或ITrigger
的JobDataMap
属性进行传值、类似MVC中的ViewData
。
在Job中取值
public async Task Execute(IJobExecuteContext)
{
...
var jobData = context.JobDetail.JobDataMap;
var triggerData = context.Trigger.JobDataMap;
var vaule = jobData.Get("key");
var value1 = triggerData.Get("key");
...
}
注意
context.MergedJobDataMap
如果多个key,会去重,以后者为准。- key区分大小写
- 保留执行结果,使用
JobDataMap.Put
方法。同时Job上打上
[PersistJobDataAfterExecution]
标签
小提示
Quartz.Net
移植自Java,所以很多api其实与java中是类似的,遇到问题时,也可以看看java社区的帖子和问题,可能会受到一些启发。Quartz.Net
可用于.Net CoreQuartz.Net
在IIS上,可能会被回收,导致作业调度失效。JobBuilder每次都创建新的Job实例。
[DisallowConcurrentExecution]
,Job打上此标签,从字面翻译是:不允许并发调度执行,表示一个Job未执行完成时,后续的调度都先等待。
0条评论