Quartz.Net介绍及与.Net Core简单集成

作者 the7
发布于 2020年02月05日
最后更新 2020年03月26日
评论 0
浏览 224

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中,我们可以利用IJobDetailITriggerJobDataMap属性进行传值、类似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 Core

  • Quartz.Net在IIS上,可能会被回收,导致作业调度失效。

  • JobBuilder每次都创建新的Job实例。

  • [DisallowConcurrentExecution],Job打上此标签,从字面翻译是:不允许并发调度执行,表示一个Job未执行完成时,后续的调度都先等待。

4条评论

  • 念往昔丶繁华竞逐

    2019年5月20日

    最后一个五官很漂亮,虽然脸稍微大了一点点,但也算普通人里漂亮的
  • Eleven

    2019年5月20日

    念往昔丶繁华竞逐:
    最后一个五官很漂亮,虽然脸稍微大了一点点,但也算普通人里漂亮的...
    这帖子真的是精品。美中不足的是,为什么要用繁体,虽然能看懂,但有些麻烦呀。
  • SukiU

    2019年5月20日

    我曾在某外企互联网公司工作过一段时间,他们就是那种工作时间聊天摸鱼,下班时间拼命工作,然后加班蹭加班费和补贴😂
微信公众号
站长帮
微信公众号,每日更新!