2020年5月20日星期三

C#作业调度Quartz.NET学习笔记

C#作业调度Quartz.NET学习笔记


    一、简单介绍

    Quartz.NET是一个强大、开源、轻量的作业调度框架,是 OpenSymphony 的 Quartz API 的.NET移植,用C#改写,可用于WinForm和ASP.NET应用中。它灵活而不复杂,可以为执行一个作业而创建简单或复杂的作业调度。它有很多特征,如:数据库支持、集群、插件、支持cron-like表达式等等。

    官网   源码:https://github.com/quartznet/quartznet

    示例   二、概念解释

    Scheduler:作业调度器。

    IJob:作业接口,继承并实现Execute, 编写执行的具体作业逻辑。

    JobBuilder:根据设置,生成一个详细作业信息(JobDetail)。

    TriggerBuilder:根据规则,生产对应的Trigger。

    三、示例程序

    3.1、界面

    新建一个WinForm程序Client,项目右键->属性->应用程序->输出类型,选择控制台应用程序。

    3.2、引用

    项目右键->管理 NuGet 程序包->Quartz.NET。

    3.2、作业

    新建一个类DataSyncJob并继承IJob,代表它是一个作业,同时实现Execute方法。

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using Quartz;namespace LinkTo.Test.Quartz.Client{ //打上DisallowConcurrentExecution标签让Job进行单线程跑,避免没跑完时的重复执行。 [DisallowConcurrentExecution] public class DataSyncJob : IJob {  public Task Execute(IJobExecutionContext context)  {   JobDataMap keyValuePairs = context.MergedJobDataMap;   if (keyValuePairs.Count > 0 && keyValuePairs.Contains("Hello"))   {    string value = context.MergedJobDataMap.Get("Hello").ToString();    return Task.Run(() =>    {     Console.WriteLine(DateTime.Now + $" Hello:{value}" + Environment.NewLine);    });   }   else   {    return Task.Run(() =>    {     Console.WriteLine(DateTime.Now + Environment.NewLine);    });   }  } }}
View Code

    说明:

    1)一般来说,作业需打上[DisallowConcurrentExecution]标签,以避免当次作业尚未完成时又被开始调度执行。

    2)作业可以接收触发器传递过来的参数(Key-Value),上面作业接收的是"Hello"参数。

    3.3、调度

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using Quartz;using Quartz.Impl;namespace LinkTo.Test.Quartz.Client{ public partial class Main : Form {  //调度器工厂  private ISchedulerFactory factory;  //调度器  private IScheduler scheduler;  public Main()  {   InitializeComponent();   //按钮状态   btnStart.Enabled = true;   btnStop.Enabled = false;  }  /// <summary>  /// 开始  /// </summary>  /// <param name="sender"></param>  /// <param name="e"></param>  private async void btnStart_Click(object sender, EventArgs e)  {   //1、创建一个调度器   factory = new StdSchedulerFactory();   scheduler = await factory.GetScheduler();   await scheduler.Start();   //2、创建一个任务   IJobDetail job = JobBuilder.Create<DataSyncJob>().WithIdentity("DataSync", "DataSync_Group").Build();   //3、创建一个触发器(有4种触发器供选择)   //4、将任务与触发器添加到调度器中   #region 触发器1:WithSimpleSchedule   //ITrigger simpleTrigger = TriggerBuilder.Create()   // .WithIdentity("DataSync_SimpleTrigger", "DataSync_TriggerGroup")   // .WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever())   // .Build();   //await scheduler.ScheduleJob(job, simpleTrigger);   

没有评论:

发表评论