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);
}
}

  

定时处理组件---Quartz.net的更多相关文章

  1. 免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)

    很多的软件项目中都会使用到定时任务.定时轮询数据库同步,定时邮件通知等功能..NET Framework具有“内置”定时器功能,通过System.Timers.Timer类.在使用Timer类需要面对 ...

  2. Kubernetes 弹性伸缩全场景解读(五) - 定时伸缩组件发布与开源

    作者| 阿里云容器技术专家刘中巍(莫源) 导读:Kubernetes弹性伸缩系列文章为读者一一解析了各个弹性伸缩组件的相关原理和用法.本篇文章中,阿里云容器技术专家莫源将为你带来定时伸缩组件  kub ...

  3. [源码分析] 定时任务调度框架 Quartz 之 故障切换

    [源码分析] 定时任务调度框架 Quartz 之 故障切换 目录 [源码分析] 定时任务调度框架 Quartz 之 故障切换 0x00 摘要 0x01 基础概念 1.1 分布式 1.1.1 功能方面 ...

  4. 一行代码完成定时任务调度,基于Quartz的UI可视化操作组件 GZY.Quartz.MUI

    前言 之前发布过第一个版本,有兴趣的可以去看看: NET Core 基于Quartz的UI可视化操作组件 GZY.Quartz.MUI 简介 GitHub开源地址:l2999019/GZY.Quart ...

  5. 定时组件quartz系列<三>quartz调度机制调研及源码分析

    quartz2.2.1集群调度机制调研及源码分析引言quartz集群架构调度器实例化调度过程触发器的获取触发trigger:Job执行过程:总结:附: 引言 quratz是目前最为成熟,使用最广泛的j ...

  6. 定时组件quartz系列<二>quartz的原理

    Quartz是一个大名鼎鼎的Java版开源定时调度器,功能强悍,使用方便.   一.核心概念   Quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可.   1. ...

  7. 定时组件quartz系列<一>模拟定时组件小程序

    一.核心概念 Quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可. 1.Job表示一个工作,要执行的具体内容.此接口中只有一个方法void execute(Jo ...

  8. 定时组件quartz系列<二>quartz的集群原理

    1.基本信息:      Quartz是一个开源的作业调度框架,它完全由java写成,并设计用于J2Se和J2EE应用中.它提供了巨大的灵活性而不牺牲简单性.你能够用它 来为执行一个作业而创建简单的或 ...

  9. 一文揭秘定时任务调度框架quartz

    之前写过quartz或者引用过quartz的一些文章,有很多人给我发消息问quartz的相关问题, quartz 报错:java.lang.classNotFoundException quartz源 ...

随机推荐

  1. js 禁止用户使用Ctrl+鼠标滚轮缩放网页

    为什么会有人会使用ctrl+鼠标滚轮缩放网页?坚决禁止! <html> <head> <title>测试</title> <script lang ...

  2. 分享知识-快乐自己:Spring切入点的表达式和通知类型

    1.切入点的表达式 表达式格式: execution([修饰符] 返回值类型 包名.类名.方法名(参数)) 其他的代替: <!-- 完全指定一个方法 --> <!-- <aop ...

  3. 十六 Django框架,信号

    Django中提供了“信号调度”,用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. 也就是当程序有指定动作时,触发一个信号函数 1.Django内置信 ...

  4. js修改css时如何考虑兼容性问题es5+es6

    es5的写法 var elementStyle = document.createElement('div').style var vendor = (function(){ let transfor ...

  5. hibernate 一级缓存、二级缓存

    一级缓存:——session一旦关掉就没有了.使用 load和get加载对象的时候,会自动加载到缓存,读取的也会读缓存. public void huancun(){ Session session= ...

  6. Echarts 关系图 添加点击事件

    /*实现的效果是:在关系图上加点击事件,点击某个点,得到改点代表的内容,并且实现一个跳转效果. 关键代码已用红色标出*/ <!DOCTYPE html> <html lang=&qu ...

  7. 数据库ACID和mvcc

    一.数据库的ACID性: 原子性(atomicity).一致性(consistency).隔离性(isolation).持久性(durability). 二.原子性 1.原子性:一个事务要么全部完成, ...

  8. Java中的泛型、枚举和注解

    1.泛型: 一.为什么要有泛型(Generic)?1.解决元素存储的安全性问题任何类型都可以添加到集合中:类型不安全2.解决获取数据元素时,需要类型强转的问题读取出来的对象需要强转:繁琐可能有Clas ...

  9. 标准模板库(STL)学习指南之set集合

    set是关联容器.其键值就是实值,实值就是键值,不可以有重复,所以我们不能通过set的迭代器来改变set的元素的值,set拥有和list相同的特性:当对他进行插入和删除操作的时候,操作之前的迭代器依然 ...

  10. 洛谷【P3952】NOIP2017提高组Day1T2时间复杂度

    我对模拟的理解:http://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.luogu.org/problemnew/show/P395 ...