1. 认识任务调度
所谓任务调度, 就是以将业务区块任务化(即抽象成每一个独立的任务, 执行每个任务便完成某种业务的需求). 比如, 我们有一个订单系统, 现在有这样的一个需求, 就是需要在某一时间点去扫描数据库, 删掉垃圾订单. 又比如, 我们想要在某一时刻去批量给用户推送信息, 等等等等. 如何去解决那?? 我们首先想到的是利用定时器或者是开线程独立扫描. 这可以说是解决方案, 但是如果是自己去实现, 难免考虑的不周全. 于是, Quartz.NET 应运而生.
2.Quartz.NET 了解
Quartz.NET 是 java 的 Quartz 移植过来的开源的作业调度框架的. net 版本, 是非常适合在平时的工作中, 定时轮询数据库同步, 定时邮件通知, 定时处理数据等. Quartz.NET 允许开发人员根据时间间隔 (或天) 来调度作业. 它实现了作业和触发器的多对多关系, 还能把多个作业与不同的触发器关联. 整合了 Quartz.NET 的应用程序可以重用来自不同事件的作业, 还可以为一个事件组合多个作业. 其实使用起来很简单, 只要了解其中的几个概念点, 就可以轻松的使用.
(1).Scheduler: 调度器, 用来将任务和触发器绑定关联起来的中枢系统.
(2).Trigger: 触发器, 定义任务的执行条件.
(3).JobDetail: 任务构建模型, 用来装载实现定义好的任务的.
3.Quartz.NET 使用
使用 nuget 包管理器安装 quartz.NET, 然后引用 using Quartz,using Quartz.Impl.. 其使用流程便是 (继承 IJob, 重写 Excute 方法 --> 构建 Scheduler-->构建 JobDetail-->构建 Trigger-->利用 Scheduler 绑定 Trigger 与 JobDetail-->开启调度)接下来, 我们来熟悉一下核心的模型及 API.
IJob: 任务基础接口, 我没定义的每一个任务, 都需要继承该接口, 并重写 Excute 方法, 并在其中书写自己的业务逻辑.
IScheduler: 调度器;
StdSchedulerFactory: 调度器构建 / 获取工厂, 我们可以通过通过 Scheduler = StdSchedulerFactory.GetDefaultScheduler(); 获取一个默认的调度器, 通过 Scheduler.Start()开启调度, 然后通过 Scheduler.ScheduleJob("任务模型","触发器模型")来关联触发器与任务.
ITrigger: 触发器;
TriggerBuilder: 触发器构造器, 通过 ITrigger trigger =TriggerBuilder.Create().WithIdentity("触发器名称,"" 触发器分组名称 ").WithCronSchedule("cron 表达式, 触发的条件 ").Build(); 构建一个触发器
IJobDetail: 任务模型.
JobDetailBuilder: 任务构造模型, 通过 IJobDetail jobDetail = JobBuilder.Create("自定义的任务对象类型").SetJobData("要传给任务的执行所需的参数对象").WithIdentity("任务名称", "任务分组名").Build();
4.Quartz.NET 的简单封装
这里, 我对基础 API 简单的封装啦一下, 方便使用 (JobConfig--> 任务参数配置模型, QuartzUtil-->核心帮助文件).
- /// <summary>
- /// 任务配置对象
- /// </summary>
- public class JobConfig
- {
- public JobConfig()
- {
- JobDataMap = new JobDataMap();
- }
- public string JobName { get; set; }// 任务名称
- public string JobGroup { get; set; }// 任务分组名
- public string TriggerName { get; set; }// 触发器名
- public string TriggerGroup { get; set; }// 触发器分组名
- public string CronExpression { get; set; }//cron 表达式
- public Type JobType { get; set; }// 任务类型
- public JobDataMap JobDataMap { get; set; } // 任务参数 map
- }
- public class QuartzUtil
- {
- private static IScheduler Scheduler { get; set; }
- static QuartzeUtil()
- {
- Scheduler = StdSchedulerFactory.GetDefaultScheduler();
- Scheduler.Start();
- }
- /// <summary>
- /// 添加任务
- /// </summary>
- /// <param name="jobConfig"></param>
- /// <returns></returns>
- public static bool AddJob(JobConfig jobConfig)
- {
- try
- {
- ITrigger trigger = TriggerBuilder.Create()
- .WithIdentity(jobConfig.TriggerName, jobConfig.TriggerGroup)
- .WithCronSchedule(jobConfig.CronExpression).Build();
- IJobDetail jobDetail = JobBuilder.Create(jobConfig.JobType).SetJobData(jobConfig.JobDataMap).WithIdentity(jobConfig.JobName, jobConfig.JobGroup).Build();
- Scheduler.ScheduleJob(jobDetail, trigger);
- return true;
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.Message);
- return false;
- }
- }
- /// <summary>
- /// 构建 cons 表达式
- /// </summary>
- /// <param name="dateTime"></param>
- /// <returns></returns>
- public static string BuildConsExpression(DateTime dateTime)
- {
- return string.Format("{0} {1} {2} {3} {4} ? {5}", dateTime.Second, dateTime.Minute, dateTime.Hour, dateTime.Day, dateTime.Month, dateTime.Year);
- }
- /// <summary>
- /// 移除任务
- /// </summary>
- /// <param name="jobConfig"></param>
- /// <returns></returns>
- public static bool RemoveJob(JobConfig jobConfig)
- {
- try
- {
- TriggerKey triggerKey = new TriggerKey(jobConfig.TriggerName, jobConfig.TriggerGroup);
- Scheduler.PauseTrigger(triggerKey);
- Scheduler.ResumeTrigger(triggerKey);
- Scheduler.DeleteJob(JobKey.Create(jobConfig.JobName, jobConfig.JobGroup));
- return true;
- }
- catch (Exception ex)
- {
- return false;
- }
- }
- /// <summary>
- /// 构建触发器
- /// </summary>
- /// <param name="triggerName"></param>
- /// <param name="groupName"></param>
- /// <param name="cronExpression"></param>
- /// <returns></returns>
- public static ITrigger BuildTrigger(string triggerName, string groupName, string cronExpression)
- {
- ITrigger trigger = TriggerBuilder.Create()
- .WithIdentity(triggerName, groupName)
- .WithCronSchedule(cronExpression).Build();
- return trigger;
- }
- /// <summary>
- /// 构建任务
- /// </summary>
- /// <param name="jobName"></param>
- /// <param name="groupName"></param>
- /// <param name="jobType"></param>
- /// <returns></returns>
- public static IJobDetail BuildJob(string jobName, string groupName, Type jobType)
- {
- IJobDetail jobDetail = JobBuilder.Create(jobType).WithIdentity(jobName, groupName).Build();
- return jobDetail;
- }
- /// <summary>
- /// 绑定任务与触发器
- /// </summary>
- /// <param name="jobDetail"></param>
- /// <param name="trigger"></param>
- public static void BindJobAndTrigger(IJobDetail jobDetail, ITrigger trigger)
- {
- Scheduler.ScheduleJob(jobDetail, trigger);
- }
- }
来源: http://www.bubuko.com/infodetail-2833408.html