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);
没有评论:
发表评论