Net作业调度(二) - Quartz.Net进阶

介绍

前面我们介绍Quartz.Net的基本用法,但在实际应用中,往往有更多的特性需求。   比如记录job执行的执行历史,发邮件等。

目录

1:Quartz.Net插件

2:TriggerListener,JobListener

3:Cron表达式

4:Quartz.Net 线程池

5:总结

Quartz.Net插件

Quartz.net 自身提供了一个插件接口(ISchedulerPlugin)用来增加附加功能。 我们来看下官方定义:

  public interface ISchedulerPlugin
    {
        void Initialize(string pluginName, IScheduler sched);
       //关闭调度器
        void Shutdown();
        //插件启动
        void Start();
    }

 继承接口,实现自己的插件。

 public class MyPlugin : ISchedulerPlugin
    {
        public void  Initialize(string pluginName, IScheduler sched)
        {
            Console.WriteLine("实例化");
        }
        public  void Start()
        {
             Console.WriteLine("启动");
        }
        public  void Shutdown()
        {
            Console.WriteLine("关闭");
        }
    }

  主函数里面配置我们实现的插件,注释部分,一句话搞定。

static void Main(string[] args)
        {
            var properties = new NameValueCollection();
           //MyPlugin 自定义名称。    "命名空间.类名,程序名称"
            properties["quartz.plugin.MyPlugin.type"] = "QuartzDemo3.MyPlugin,QuartzDemo3"; 

            var schedulerFactory = new StdSchedulerFactory(properties);
            var scheduler = schedulerFactory.GetScheduler();

            var job = JobBuilder.Create<HelloJob>()
                .WithIdentity("myJob", "group1")
                .Build();

            var trigger = TriggerBuilder.Create()
                                .WithIdentity("mytrigger", "group1")
                                .WithCronSchedule("/2 * * ? * *")
                                .Build();

            scheduler.ScheduleJob(job, trigger);
            scheduler.Start();
            Thread.Sleep(6000);
            scheduler.Shutdown(true);
            Console.ReadLine();

        }

  运行结果如下:

TriggerListener,JobListener

ITriggerListener官方定义的接口,这里我们直接继承实现。

public class MyTriggerListener : ITriggerListener
    {
        private string name;

        public void TriggerComplete(ITrigger trigger, IJobExecutionContext context, SchedulerInstruction triggerInstructionCode)
        {
            Console.WriteLine("job完成时调用");
        }
        public void TriggerFired(ITrigger trigger, IJobExecutionContext context)
        {
            Console.WriteLine("job执行时调用");
        }
        public void TriggerMisfired(ITrigger trigger)
        {
            Console.WriteLine("错过触发时调用(例:线程不够用的情况下)");
        }
        public bool VetoJobExecution(ITrigger trigger, IJobExecutionContext context)
        {
            //Trigger触发后,job执行时调用本方法。true即否决,job后面不执行。
            return false;
        }
        public string Name { get { return name; } set { name = value; } }
    }

main函数添加:

           //添加监听器到指定的trigger
            scheduler.ListenerManager.AddTriggerListener(myJobListener, KeyMatcher<TriggerKey>.KeyEquals(new TriggerKey("mytrigger", "group1")));

            ////添加监听器到指定分类的所有监听器。
            //scheduler.ListenerManager.AddTriggerListener(myJobListener, GroupMatcher<TriggerKey>.GroupEquals("myJobGroup"));

            ////添加监听器到指定分类的所有监听器。
            //scheduler.ListenerManager.AddTriggerListener(myJobListener, GroupMatcher<TriggerKey>.GroupEquals("myJobGroup"));

           ////添加监听器到指定的2个分组。
            //scheduler.ListenerManager.AddTriggerListener(myJobListener, GroupMatcher<TriggerKey>.GroupEquals("myJobGroup"), GroupMatcher<TriggerKey>.GroupEquals("myJobGroup2"));

            ////添加监听器到所有的触发器上。
            //scheduler.ListenerManager.AddTriggerListener(myJobListener, GroupMatcher<TriggerKey>.AnyGroup());

            scheduler.Start();

  

JobListener同理,这里不多做描述。

Cron表达式

quartz中的cron表达式和Linux下的很像。 像  "/5 * * ? * * *"  这样的7位表达式,最后一位年非必选。 从左到右,下面是属性。

字段名 允许的值 特殊字符
Seconds 0-59 , - * /
Minutes 0-59 , - * /
Hours 0-23 , - * /
Day of month 1-31 , - * ? / L W
Month 1-12 or JAN-DEC , - * /
Day of week 1-7 or SUN-SAT , - * ? / L #
Year 空, 1970-2099 , - * /
特殊字符 解释
, 或的意思。例:分钟位 5,10  即第5分钟或10分都触发。 
/ a/b。     a:代表起始时间,b频率时间。 例; 分钟位  3/5,  从第三分钟开始,每5分钟执行一次。
* 频率。    即每一次波动。    例;分钟位 *  即表示每分钟 
- 区间。    例: 分钟位   5-10 即5到10分期间。 
? 任意值 。     即每一次波动。只能用在DayofMonth和DayofWeek,二者冲突。指定一个另一个一个要用?
L 表示最后。 只能用在DayofMonth和DayofWeek,4L即最后一个星期三
W 工作日。  表示最后。 只能用在DayofWeek
# 4#2。 只能用DayofMonth。 某月的第二个星期三  

实例介绍

”0 0 10,14,16 * * ?"    每天10点,14点,16点 触发。

"0 0/5 14,18 * * ?"    每天14点或18点中,每5分钟触发 。

"0 4/15 14-18 * * ?"       每天14点到18点期间,  从第四分钟触发,每15分钟一次。

"0 15 10 ? * 6L"        每月的最后一个星期五上午10:15触发。

ThreadPool

properties["quartz.threadPool.threadCount"] = "5";  //线程池设置

这个线程池的设置,是指同时间。调度器能执行Job的最大数量。

quartz是用每个线程跑一个job。 上面的设置,可以解释是job并发时能执行5个job。剩下的job如果触发时间恰好到了,当前job会暂停状态,直到有可用的线程。

如果在指定的时间还没可用线程,会触发misfired。

quartz 给我提供了IThreadPool接口,我们也可以用其他的线程实现。下面是配置项。

properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";

一般来说我们的作业调度很少并发触发大量job。当然如果你有上百个,那就根据实际需要评估,增加线程数量吧。

总结

官方有LoggingTriggerHistoryPlugin,LoggingJobHistoryPlugin  已实现的,触发器和job历史记录的插件。

Quartz.Plugin 命名空间下有官方实现的一些插件,也可以自己增加扩展。

quartz中监听器还有SchedulerListener,使用方法基本一样。 另外监听器都是操作的。

本文基于自用经验,和官方文档代码来写的,有些是直接翻译的。 如果错误之处,希望请指出。

时间: 2024-08-03 11:19:03

Net作业调度(二) - Quartz.Net进阶的相关文章

作业调度框架 Quartz.NET 2.0 StepByStep

注:目前网上诸多介绍Quartz.net的文章,甚至Quartz.net官网上的Tutorial都是1.0版本的,而这个项目在2.0版本对项目进行了比较大规模的修改,使得原有的很多例子都不能运行,故写此文.由于本人是边学边用,加之技术写作水平皆有限,错误自然难免,望轻拍,我将不定时更新完善此贴,希望能为需要的朋友提供帮助. 1. 项目介绍 现今的系统,业务数据是越来越大,传统的同步处理方式有时候已经不能满足用户需求,定时后台服务这种异步数据处理形式则逐渐被大家接受.相信大家在平时的工作中也经常遇

位运算简介及实用技巧(二):进阶篇(1)[转]

位运算简介及实用技巧(二):进阶篇(1) 原贴链接:http://www.matrix67.com/blog/archives/264 =====   真正强的东西来了!   ===== 二进制中的1有奇数个还是偶数个    我们可以用下面的代码来计算一个32位整数的二进制中1的个数的奇偶性,当输入数据的二进制表示里有偶数个数字1时程序输出0,有奇数个则输出1.例如,1314520的二进制101000000111011011000中有9个1,则x=1314520时程序输出1.var   i,x,

Exceptionless(二) - 使用进阶

原文:Exceptionless(二) - 使用进阶 Exceptionless(二) - 使用进阶 作者:markjiang7m2 原文地址:https://www.cnblogs.com/markjiang7m2/p/11100563.html 官网地址:http://letyouknow.net 在上一篇文章Exceptionless - .Net Core开源日志框架中就说到如何对Exceptionless进行本地化部署,不过我也跟大家说了,仅限于能用的阶段.那今天我就继续来探讨一下如何

Net作业调度(一) -Quartz.Net入门 Quartz表达式生成器 [转]

背景 很多时候,项目需要在不同个时刻,执行一个或很多个不同的作业. Windows执行计划这时并不能很好的满足需求了. 这时候需要一个更为强大,方便管理,集部署的作业调度了. 介绍 Quartz一个开源的作业调度框架,OpenSymphony的开源项目.Quartz.Net 是Quartz的C#移植版本. 它一些很好的特性: 1:支持集群,作业分组,作业远程管理. 2:自定义精细的时间触发器,使用简单,作业和触发分离. 3:数据库支持,可以寄宿Windows服务,WebSite,winform等

Net作业调度(一) -Quartz.Net

背景 很多时候,项目需要在不同个时刻,执行一个或很多个不同的作业. Windows执行计划这时并不能很好的满足需求了. 这时候需要一个更为强大,方便管理,支持集群的作业调度了. 介绍 Quartz一个开源的作业调度框架,OpenSymphony的开源项目.Quartz.Net 是Quartz的C#移植版本. 它一些很好的特性: 1:支持集群,作业分组,作业远程管理. 2:自定义精细的时间触发器,使用简单,作业和触发分离. 3:数据库支持,可以寄宿Windows服务,WebSite,winform

Net作业调度(二) -CrystalQuartz远程管理

Source Code-1.6M 介绍 接着上一篇. 我们已经初步会使用Quartz.NET了.但如果想方便的知道某个作业执行情况,并暂停,启动等等,这时候就需要个管理界面了. 本文介绍Quartz.NET 远程管理.如图: 实战 一:作业服务端 static void Main(string[] args) { var properties = new NameValueCollection(); properties["quartz.scheduler.instanceName"]

定时组件quartz系列&lt;二&gt;quartz的集群原理

1.基本信息: Quartz是一个开源的作业调度框架,它完全由java写成,并设计用于J2Se和J2EE应用中.它提供了巨大的灵活性而不牺牲简单性.你能够用它 来为执行一个作业而创建简单的或复杂的调度.它有很多特征,如:数据库支持,集群,插件,EJB作业预构建,JavaMail及其它,支持cron- like表达式等等.其中集群配置一般比较复杂,那么在Quartz中如何配置它的集群特性呢? 2 Quartz的集群配置:      2.1 实现集群的基本原理           Quartz是通过

.Net平台开源作业调度框架Quartz.Net

Quartz.NET介绍: Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性而不牺牲简单性.你能够用它来为执行一个作业而创建简单的或复杂的调度.它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等. Quartz.Net的cron表达式: 一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素. 字段   允许值   允许的

Quartz.Net进阶之六:详述 JobStores

一.介绍 今天开始学习 JobStore,别的先不说,也不用翻译软件来翻译,直接从字面意思看来理解一下.我第一眼的感觉就是 job 是任务的意思,Store 是商店的意思,连起来就是可以存储 Job 的商店,或者说专门用来存储 Job 的容器.废话少说,开始我们今天的学习吧.  二.详述 JobStore JobStore 负责跟踪您为调度程序提供的所有"工作数据":任务,触发器,日历等.为 Quartz 调度程序实例选择适当的IJobStore实现是一个重要的步骤. 幸运的是,一旦你