tnblog
首页
视频
资源
登录
有个性,不需要签名
排名
17
文章
40
粉丝
16
评论
21
Linq or Sql 取树末级节点
剑轩 : 这个方法是真的帅!
Python实例 2-12306抢票(二) 下单
18335584353 : 哥。我也是总返回url":"/leftTicket/init",&quot...
Visual Studio小技巧
剑轩 : [斜眼笑][斜眼笑]开会完了认真看了一遍
C#网络流读取(图片)
风清月 : 把一个图片放到字节数组里边[发呆](`・ω・´)
C#与Java二进制编码转换,补码
风清月 : 我勒个擦.....有时间这种问题很坑很难发现哇o(╥﹏╥)o
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

Quartz.NET实例,动态改变周期调度。misfire、Cron

8481人阅读 2018/11/22 18:46 总访问:302009 评论:0 收藏:0 手机
分类: .NET

    

Quartz:Java编写的开源的任务调度作业框架 类似Timer之类定时执行的功能,但是更强大

Quartz.NET:是把Quartz转成C#  NuGet中可以直接下载对应类库


官网:https://www.quartz-scheduler.net/


主要对象:


Job :工作,要执行的具体内容继承IJob。此接口中只有一个方法:execute(IJobExecutionContext context) 

JobDetail:具体的可执行的调度程序,Job 是这个可执行程调度程序所要执行的内容

Trigger:调度参数的配置,什么时候去调 执行间隔。 

Scheduler:调度容器,一个调度容器中可以注册多个 JobDetail 和 Trigger。当 Trigger 与 JobDetail 组合,就可以被 Scheduler 容器调度了。 

大体介绍:

  1. static void Main(string[] args)
  2.         {
  3.             Task<IScheduler> task_scheduler = StdSchedulerFactory.GetDefaultScheduler();
  4.             IScheduler scheduler = task_scheduler.Result;
  5.  
  6.             //ISchedulerFactory _SchedulerFactory = new StdSchedulerFactory();
  7.             //IScheduler scheduler = _SchedulerFactory.GetScheduler().Result;
  8.  
  9.             /*  
  10.              *   过程:
  11.              *      一.通过StdSchedulerFactory计划工厂对象创建调度计划Scheduler
  12.              *      二.创建Job对象,需要继承IJob 实现执行方法
  13.              *      三.触发对象,2种:间隔执行和定时执行
  14.              *          1.ITrigger:间隔执行
  15.              *          2.ICronTrigger:定时执行
  16.              *      四.将job对象和触发对象传入调度计划Scheduler 开始执行
  17.              *  
  18.              * 
  19.              */
  20.             //job创建
  21.             IJobDetail job = JobBuilder.Create<SayHello>().WithIdentity("定时确认完成订单").Build();
  22.  
  23.             ////创建简单计时器
  24.             //ISimpleTrigger _SimpleTrigger = TriggerBuilder.Create()
  25.             //    .WithSimpleSchedule(t => t //声明定时
  26.             //    .WithIntervalInSeconds(2) //5秒一次
  27.             //    .RepeatForever()) //永远执行
  28.             //    .StartNow() //立即开始
  29.             //    .Build() //创建
  30.             //    as ISimpleTrigger;
  31.             ////关联job与计时器
  32.             //scheduler.ScheduleJob(job, _SimpleTrigger);
  33.             /*
  34.              * WithCronSchedule参数说明:
  35.              *  秒 分 时 某一天 月 周 年(可选参数,一般不用)
  36.              *  秒分的合法值为0-59,小时:0-23,日期(天):0-31[要注意不同的月份中的天数不同] 月:0-11[或JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC] 星期:1-7(1=星期日)或[SUN,MON,TUE,WED,THU,FRI,SAT]    (程序员数数法。。 万事0开始)( 涉及到星期最好用英文)
  37.              *      通配符{[, - * /]都可以使用、[L #]只能星期课额外使用、[L W]天数可额外使用}
  38.              *          ',' 子条件
  39.              *          '*' 代表任意值的所有 
  40.              *          '-' 代表一个时段 
  41.              *          '/' 代表值的增量 
  42.              *                  比如:分钟域中放入'0/15' 表示【从0开始 每隔15分钟】 '3/20'表示【从第3分钟开始 每隔20分钟】 等同【3,23,43】
  43.              *          '?' 只能用在天数或者星期中 表示【没有指定值,满足所有】 
  44.              *          'L' 只能用在天数或者星期中 表示【这个时段的最后一天】 
  45.              *                  比如:月份中 1月的31号 2月的28或者29号 反正最后一天,或者 4L:该月的最后一个周四 6L:该月的最后一个周四。  
  46.              *                  注意!星期中表示【周六 SAT(手动加粗)】 
  47.              *          'W' 代表离给定日期最近的那个工作日
  48.              *                  比如:天数设置为15W 表示【离本月15号最近的一个工作日】??
  49.              *          'LW'代表这个月最后一周的工作日 可以在日期使用 ?待测
  50.              *          '#' 代表本月的第几个工作日
  51.              *                  比如:星期中设置6#3 当月的第三个周五(6是周五!)
  52.              * 
  53.              *  过失触发:
  54.              *    withMisfireHandlingInstructionDoNothing--->misfireInstruction = 2
  55.              *     ——不触发立即执行
  56.              *     ——等待下次Cron触发频率到达时刻开始按照Cron频率依次执行
  57.              *
  58.              *    withMisfireHandlingInstructionFireAndProceed--->misfireInstruction = 1
  59.              *     ——以当前时间为触发频率立刻触发一次执行
  60.              *     ——然后按照Cron频率依次执行
  61.              *
  62.              *     withMisfireHandlingInstructionIgnoreMisfires--->misfireInstruction = -1
  63.              *     ——以错过的第一个频率时间立刻开始执行
  64.              *     ——重做错过的所有频率周期后
  65.              *     ——当下一次触发频率发生时间大于当前时间后,再按照正常的Cron频率依次执行
  66.              * 
  67.              * 
  68.              * 
  69.              * 实例:
  70.              *      "0 0/5 * * * ?" 每5分钟
  71.              *      "10 0/5 * * * ?" 这分钟后 10 秒起, 每五分钟
  72.              *      "0 30 10-13 ? * WED,FRI" 每周三、周五的10点到13点的30分时 【每周三, 周五 10:30, 11:30, 12:30 和 13:30】
  73.              *      "0 0/30 8-9 5,20 * ?" 每个月的5号、20号的8点9点之间 每半小时触发一次 因为0开始 所以10点的时候不触发【8:00, 8:30, 9:00  9:30 】
  74.              *      "0 0-5 14 * * ?"  每天的14:00到14:05分每分钟一次
  75.              *      "0 10,44 14 ? 3 WED" 每年三月的周三14:10和14:44
  76.              *      "0 15 10 ? * MON-FRI" 每周三到周五的10::15
  77.              *      "0 15 10 ? * 6#3" 每个月第三个周五的10:15
  78.              * 
  79.              *   生成表达式的网站:http://cron.qqe2.com/?tdsourcetag=s_pctim_aiomsg 小时模块的增量有bug注意下 但大体不影响使用
  80.             */
  81.             ICronTrigger _CronTrigger = TriggerBuilder.Create()
  82.                 .WithIdentity("定时确认")
  83.                 .WithCronSchedule("0/2 * * * * ?"//秒 分 时 某一天 月 周 年(可选参数)
  84.                 .Build()
  85.                 as ICronTrigger;
  86.             scheduler.ScheduleJob(job, _CronTrigger);
  87.  
  88.  
  89.             scheduler.Start();
  90.             Console.ReadLine();
  91.         }
  92.     }
  93.  
  94.     public class SayHello : IJob
  95.     {
  96.         public async Task Execute(IJobExecutionContext context)
  97.         {
  98.             Console.WriteLine("Hello Wrold!");
  99.         }
  100.     }


 

 


实例:


1.创建job

  1. public class SayHello : IJob
  2.     {
  3.         public static int ii = 0;
  4.         static string str = "服务1=Cron 5秒一次。Hello World==SayHello  ";
  5.         public async Task Execute(IJobExecutionContext context)
  6.         {
  7.              
  8.             if (ii == 1)
  9.             {
  10.                 QuartzManage.ModifyJob(context.JobDetail, context.Trigger as ICronTrigger, "0/2 * * * * ?");
  11.                 ii = 0;
  12.                 str += ",周期已改变!!变成2秒一次 ";
  13.             }
  14.             Common.WriteLog(str + context.Scheduler.GetHashCode());
  15.         }
  16.     }
  17.  
  18.     public class SayCZ : IJob
  19.     {
  20.         public async Task Execute(IJobExecutionContext context)
  21.         {
  22.             Common.WriteLog("服务2=Simple 3秒一次。Hello CZ==SayCZ  " + context.Scheduler.GetHashCode());
  23.         }
  24.     }




2.Quartz管理类

  1. public class QuartzManage
  2.     {
  3.         static Task<IScheduler> task_scheduler = StdSchedulerFactory.GetDefaultScheduler();
  4.         static IScheduler scheduler;
  5.         private static readonly object objlock = new object();
  6.         static QuartzManage()
  7.         {
  8.             if (scheduler == null)
  9.             {
  10.                 lock (objlock)
  11.                 {
  12.                     if (scheduler == null)
  13.                         scheduler = task_scheduler.Result;
  14.                 }
  15.             }
  16.         }
  17.  
  18.         /// <summary>
  19.         /// 以Simple开始一个工作
  20.         /// </summary>
  21.         /// <typeparam name="T"></typeparam>
  22.         /// <param name="name"></param>
  23.         /// <param name="simpleInterval"></param>
  24.         public static void StartJobWithSimple<T>(string name, Action<SimpleScheduleBuilder> simpleInterval) where T : IJob
  25.         {
  26.             IJobDetail job = JobBuilder.Create<T>().WithIdentity(name + "_job", name + "_group").Build();
  27.             ITrigger Simple = TriggerBuilder.Create().StartNow()
  28.                                .WithSimpleSchedule(simpleInterval)
  29.                                .Build() as ISimpleTrigger;
  30.  
  31.             scheduler.ScheduleJob(job, Simple);
  32.             scheduler.Start();
  33.         }
  34.  
  35.         /// <summary>
  36.         /// 以Cron开始一个工作
  37.         /// </summary>
  38.         /// <typeparam name="T"></typeparam>
  39.         /// <param name="name"></param>
  40.         /// <param name="CronExpression"></param>
  41.         public static void StartJobWithCron<T>(string name, string CronExpression) where T : IJob
  42.         {
  43.  
  44.             IJobDetail job = JobBuilder.Create<T>().WithIdentity(name + "_job", name + "_group").Build();
  45.  
  46.             ITrigger CronTrigger = TriggerBuilder.Create().StartNow().WithIdentity(name + "_trigger", name + "_group")
  47.                                     .WithCronSchedule(CronExpression, w => w.WithMisfireHandlingInstructionDoNothing())
  48.                                     .Build() as ICronTrigger;
  49.  
  50.             scheduler.ScheduleJob(job, CronTrigger);
  51.             scheduler.Start();
  52.         }
  53.  
  54.         /// <summary>
  55.         /// Cron修改频率
  56.         /// </summary>
  57.         /// <param name="job"></param>
  58.         /// <param name="trigger"></param>
  59.         /// <param name="CronExpression"></param>
  60.         public static void ModifyJob(IJobDetail job, ICronTrigger trigger, string CronExpression)
  61.         {
  62.             ICronTrigger _ICronTrigger = trigger;
  63.             _ICronTrigger.CronExpressionString = CronExpression;
  64.  
  65.             scheduler.RescheduleJob(trigger.Key, _ICronTrigger);
  66.         }
  67.  
  68.         /// <summary>
  69.         /// Simple修改频率
  70.         /// </summary>
  71.         /// <param name="job"></param>
  72.         /// <param name="trigger"></param>
  73.         /// <param name="SimpleTime"></param>
  74.         public static void ModifyJob(IJobDetail job, ISimpleTrigger trigger, TimeSpan SimpleTime)
  75.         {
  76.             ISimpleTrigger _ISimpleTrigger = trigger;
  77.             _ISimpleTrigger.RepeatInterval = SimpleTime;
  78.  
  79.             scheduler.RescheduleJob(trigger.Key, _ISimpleTrigger);
  80.         }
  81.  
  82.     }




3.执行调度,并改变周期

  1. public partial class Form1 : Form
  2.     {
  3.         public Form1()
  4.         {
  5.             InitializeComponent();
  6.         }
  7.  
  8.  
  9.         /// <summary>
  10.         /// Cron
  11.         /// </summary>
  12.         /// <param name="sender"></param>
  13.         /// <param name="e"></param>
  14.         private void button1_Click(object sender, EventArgs e)
  15.         {
  16.             QuartzManage.StartJobWithCron<SayHello>("first""0/5 * * * * ?");
  17.         }
  18.  
  19.         /// <summary>
  20.         /// Simple运行
  21.         /// </summary>
  22.         /// <param name="sender"></param>
  23.         /// <param name="e"></param>
  24.         private void button2_Click(object sender, EventArgs e)
  25.         {
  26.             QuartzManage.StartJobWithSimple<SayCZ>("second", x => x.WithIntervalInSeconds(3).RepeatForever()); //每三秒 一直执行
  27.         }
  28.  
  29.         private void button3_Click(object sender, EventArgs e)
  30.         {
  31.             SayHello.ii = 1;
  32.         }
  33.     }



执行结果:



改变周期后 会有一个过时触发的问题 根据设置不同的模式 执行的效果不同 misfire的概念,第一个代码块中有详细注释说明


 


代码实例: https://download.csdn.net/download/commandbaby/10664266



欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

Python学习 3-爬虫基本介绍 及简单实例

爬虫爬虫就是一只猪,蜘蛛。。 网络蜘蛛。互联网是一个网由各个网站组成。无数的蜘蛛就在网上到处爬,根据网址从一个网站爬...

Python实例 1-日志抓取处理 补错(附日志小技巧)

有时候数据出了问题,可以从日志中恢复数据(如果你没记日志..没备份..→_→..)一、日志展示介绍个平常自己用的小方法,如...

Python实例 2-12306抢票(一) 登陆

开坑年关将近,终于对12306下手了,,平安夜撸代码,攻克了12306的登陆 2018-12-24 22:16:00没错 这篇博客就写从零开始的异...

Python实例 2-12306抢票(二) 下单

第二篇 刷票与下单1.记住登陆上一篇写了登陆:http://www.tnblog.net/cz/article/details/162 为了方便调试 不让每次登陆都...

思宇课后实例—全选和部分选中

jQuery课后实例昨天我们初次写了全(不)选和反选功能,今天我们来写下它的变种功能1.首先我们老规矩,来看下需求2.然后我们...

正则简单实例

正则:用来查找、替换,拆分某些符合规则的文本介绍一些常用的一些正则符号、规则!特殊符号*:重复多次、贪婪匹配+:重复一...

netcore加Consul实现简单服务实例负载

今天,总结一下之前学习的Consul基础(后续如果有时间的话,再加上Ocelot部分):新建一个WebApi项目:模拟服务创建一个Web...

需要更新的以前的visual studio2010实例

电脑中安装过Visual Studio比较低版本的软件的时候,将原本的Microsoft Visual Studio 2010 Service Pack 1进行了更改,导...

利用 反射实例化泛型参数

publicstaticvoidss&lt;T&gt;(thisIQueryable&lt;T&gt;ww) { T自定义名=Activator.CreateInstance&lt;T&gt;(); }

反射根据字符串实例化对象

前言根据字符串实例化对象对象名与字符串名需要相同我希望有个如你一般的人//根据字符串实例化对象(需要存在这个这个类) ...

android 布局实例解析 格子菜单效果

使用android权重布局,使每个格子和间隔在不同手机中自动适配: &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8...

反射实例化并动态赋值

Typetype=typeof(User);//获取类型 objecta=Activator.CreateInstance(type);//创建对象 foreach(varPropintype.GetPrope...

vue 实现数字滚动增加效果的实例代码

代码如下,可以直接运行&lt;template&gt; &lt;div class=&quot;number-grow-warp&quot;&gt; &lt;span ref=&quot;numberG...

python 机器学习的尝鲜实例(一)学习笔记

python 机器学习的尝鲜实例(一)学习笔记[TOC] 确定问题任务:利用加州人口普查数据建立该州房价模型问题要确定业务目标...

ts实现面向对象编程,定义属性方法,构造函数,私有方法,以及引用类,实例化类等。vue3使用ts对象

[TOC]ts实现面向对象编程,定义属性,构造函数等基础使用在 TypeScript 中,你可以使用类和面向对象编程(OOP)的概念来实...