Quartz.NET开源作业调度框架系列(一):快速入门step by step
Quartz.NET是一个被广泛使用的开源作业调度框架 , 由于是用C#语言创建,可方便的用于winform和asp.net应用程序中。Quartz.NET提供了巨大的灵活性但又兼具简单性。开发人员可用它快捷的创建并执行一个自动化作业。Quartz.NET有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等。
1 为什么选择Quartz.NET
在大部分的应用中,都需要对数据库进行定期备份 , 这个备份任务可以是每天晚上12:00或者每周星期二晚上12:00,或许仅仅每个月的最后一天执行。如果应用程序中需要这样的自动化执行任务 , 那么建议使用Quartz.NET调度器作为框架,为我们提供基础服务。 Quartz.NET允许开发人员根据时间间隔(或天)来调度作业 , 它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。整合了 Quartz.NET的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业.
2 如何创建一个简单的Quartz.NET
2.1 创建桌面应用程序并添加类库
用VS2012创建一个QuartzDemo的桌面应用程序 , 并用NuGet程序包管理添加Quartz.NET , 添加好类库后 , 项目文件如下图所示:
Quartz依赖库为Common.Logging和Common.Logging.Core , 二者需要一并导入 . 然后修改Form1的标题为QuartzDemo.
2.2 Form1定制
在Form1设计视图上 , 为该窗体添加一个TextBox和Panel , 并设置相关属性(背景色,字体等) , 如下图所示:
为了直观的执行定期任务 , 我们添加一个时序图(用Oxyplot控件) , 这里下载并引用Oxyplot.在Form1.cs文件中 ,首先引入需要的命名空间:
- using Quartz;
- using Quartz.Impl;
- using Quartz.Job;
- using System.Threading;
- using OxyPlot;
- using OxyPlot.Axes;
- using OxyPlot.Series;
重载一个带参数的Form1构造方法:
- private bool isFirst = true;
- public Form1(string msg)
- {
- InitializeComponent();
- _msg = msg;
- try
- {
- //启动 scheduler
- scheduler.Start();
- // 定义一个job并和自定义的HelloJob进行绑定
- IJobDetail job = JobBuilder.Create<HelloJob>()
- .WithIdentity("HelloJob", "SimpleGroup")
- .Build();
- #region Cron Expressions
- // ITrigger trigger2 = TriggerBuilder.Create()
- //.WithIdentity("trigger3", "group1")
- //.WithCronSchedule(" 0 0/5 * * * ?", x => x
- // .WithMisfireHandlingInstructionFireAndProceed())
- //.ForJob("job1", "group1")
- //.Build();
- #endregion
- //定义一个即时触发的触发器,(每隔1秒进行重复执行)
- ITrigger trigger= TriggerBuilder.Create()
- .WithIdentity("trigger1", "SimpleGroup")
- .StartNow()
- .WithSimpleSchedule(x => x
- .WithIntervalInSeconds()
- .RepeatForever())
- .Build();
- // 将job和trigger进行绑定,并告知 quartz 调度器用trigger去执行job
- scheduler.ScheduleJob(job, trigger);
- }
- catch (SchedulerException se)
- {
- Console.WriteLine(se);
- }
- }
在Form1的FormClosed事件,即窗体关闭后,将scheduler关闭:
- private void Form1_FormClosed(object sender, FormClosedEventArgs e)
- {
- //关闭 scheduler
- scheduler.Shutdown();
- }
在窗体加载时,创建一个时序图:
- public OxyPlot.WindowsForms.PlotView Plot;
- private LineSeries lineSeries = new LineSeries { Title = "即时监控(1秒)", StrokeThickness = };
- private void Form1_Load(object sender, EventArgs e)
- {
- Plot = new OxyPlot.WindowsForms.PlotView();
- Plot.Model = new PlotModel();
- Plot.Dock = DockStyle.Fill;
- this.panel1.Controls.Add(Plot);
- Plot.Model.PlotType = PlotType.XY;
- Plot.Model.Background = OxyColor.FromRgb(, , );
- Plot.Model.TextColor = OxyColor.FromRgb(, , );
- // add Series and Axis to plot model
- Plot.Model.Series.Add(lineSeries);
- Plot.Model.Axes.Add(new LinearAxis());
- }
定义一个SetMsg方法来更新消息:
- private double xInit = ;
- public bool SetMsg(string msg)
- {
- _msg = msg;
- //号称NET4最简单的跨进程更新UI的方法
- this.Invoke((MethodInvoker)delegate
- {
- // runs on UI thread
- if (isFirst)
- {
- this.txtLog.AppendText("Hello to Quartz NET ! Created by JackWang 2015");
- isFirst = false;
- }
- this.txtLog.AppendText(string.Format("\r\n$JackWang>> You get {0} message from Quartz MyJob...", _msg));
- xInit = xInit + ;
- lineSeries.Points.Add(new DataPoint(xInit,double.Parse(_msg)));
- if (lineSeries.Points.Count > )
- {
- //保留最近50个点
- lineSeries.Points.RemoveAt();
- }
- //更新图表数据
- this.Plot.Model.InvalidatePlot(true);
- });
- return true;
- }
2.3 定义一个HelloJob
在带参数的Form1构造方法中 , 创建的HelloJob的定义为:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- namespace QuartzDemo
- {
- using Quartz;
- using Quartz.Impl;
- using Quartz.Job;
- public class HelloJob : IJob
- {
- private static Form1 __instance = null;
- public void Execute(IJobExecutionContext context)
- {
- if (isOpen("Form1"))
- {
- //获取当前Form1实例
- __instance = (Form1)Application.OpenForms["Form1"];
- //随机生成小于100的数
- string num = new Random().Next().ToString();
- //通过方法更新消息
- __instance.SetMsg(num);
- }
- else
- {
- //__instance = new Form1("0");
- //__instance.Show();
- }
- }
- /// <summary>
- /// 判断窗体是否打开
- /// </summary>
- /// <param name="appName"></param>
- /// <returns></returns>
- private bool isOpen(string appName)
- {
- FormCollection collection = Application.OpenForms;
- foreach (Form form in collection)
- {
- if (form.Name == appName)
- {
- return true;
- }
- }
- return false;
- }
- }
- }
注意修改Program.cs中用带参数的Form1构建方法进行实例创建:
- [STAThread]
- static void Main()
- {
- Application.EnableVisualStyles();
- Application.SetCompatibleTextRenderingDefault(false);
- Application.Run(new Form1(""));
- }
3 最终效果
最终效果如下 , 每隔1秒,就是用随机的数来更新文本框和图表中的内容:
值得注意的是,如果用下面的代码格式,必须保证二者的名称完全一致,否则无法实现任务和触发器的绑定.
Quartz.NET开源作业调度框架系列(一):快速入门step by step的更多相关文章
- Quartz.NET开源作业调度框架系列(一):快速入门step by step-转
Quartz.NET是一个被广泛使用的开源作业调度框架 , 由于是用C#语言创建,可方便的用于winform和asp.net应用程序中.Quartz.NET提供了巨大的灵活性但又兼具简单性.开发人员可 ...
- Quartz.NET开源作业调度框架系列
Quartz.NET是一个被广泛使用的开源作业调度框架 , 由于是用C#语言创建,可方便的用于winform和asp.net应用程序中.Quartz.NET提供了巨大的灵活性但又兼具简单性.开发人员可 ...
- Quartz.NET开源作业调度框架系列(三):IJobExecutionContext 参数传递
前面写了关于Quartz.NET开源作业调度框架的入门和Cron Trigger , 这次继续这个系列, 这次想讨论一下Quartz.NET中的Job如何通过执行上下文(Execution Conte ...
- Quartz.NET开源作业调度框架系列(三):IJobExecutionContext 参数传递-转
前面写了关于Quartz.NET开源作业调度框架的入门和Cron Trigger , 这次继续这个系列, 这次想讨论一下Quartz.NET中的Job如何通过执行上下文(Execution Conte ...
- Quartz.NET开源作业调度框架系列(五):AdoJobStore保存job到数据库
Quartz.NET 任务调度的核心元素是 scheduler, trigger 和 job,其中 trigger(用于定义调度时间的元素,即按照什么时间规则去执行任务) 和 job 是任务调度的元数 ...
- Quartz.NET开源作业调度框架系列(四):Plugin Job
如果在Quartz.NET作业运行时我们想动态修改Job和Trigger的绑定关系,同时修改一些参数那么该怎么办呢?Quartz.NET提供了插件技术,可以通过在XML文件中对Job和Trigger的 ...
- Quartz.NET开源作业调度框架系列(四):Plugin Job-转
如果在Quartz.NET作业运行时我们想动态修改Job和Trigger的绑定关系,同时修改一些参数那么该怎么办呢?Quartz.NET提供了插件技术,可以通过在XML文件中对Job和Trigger的 ...
- Quartz.NET开源作业调度框架系列(二):CronTrigger
CronTriggers比SimpleTrigger更加的灵活和有用,对于比较复杂的任务触发规则,例如"每个星期天的晚上12:00"进行备份任务,SimpleTrigger就不能胜 ...
- Quartz.NET开源作业调度框架系列(二):CronTrigger-转
CronTriggers比SimpleTrigger更加的灵活和有用,对于比较复杂的任务触发规则,例如"每个星期天的晚上12:00"进行备份任务,SimpleTrigger就不能胜 ...
随机推荐
- fabric upgrade from old crashlystic stuck in build
提示build,一直没有反应. 问题:工程中原有的shell命令屏蔽掉了
- js实现图片加载特效(从左到右,百叶窗,从中间到两边)
/* 网上百度的,感觉”从中间到两边“的效果写的不是很好,改了一下,感觉可以了!*/<html> <head> <title></title> < ...
- Cwinux源码解析(五)
Cwinux源码解析(五)
- 【原创】C#搭建足球赛事资料库与预测平台(6) 赔率数据表设计2
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源C#彩票数据资料库系列文章总目录:[目录]C#搭建足球赛事资料库与预测平台与彩票数据分析目录 本篇文章开始将逐步介 ...
- 邻接表无向图(二)之 C++详解
本章是通过C++实现邻接表无向图. 目录 1. 邻接表无向图的介绍 2. 邻接表无向图的代码说明 3. 邻接表无向图的完整源码 转载请注明出处:http://www.cnblogs.com/skywa ...
- Java多线程系列--“JUC集合”04之 ConcurrentHashMap
概要 本章是JUC系列的ConcurrentHashMap篇.内容包括:ConcurrentHashMap介绍ConcurrentHashMap原理和数据结构ConcurrentHashMap函数列表 ...
- 队列的存储结构和常见操作(c 语言实现)
一.队列(queue) 队列和栈一样,在实际程序的算法设计和计算机一些其他分支里,都有很多重要的应用,比如计算机操作系统对进程 or 作业的优先级调度算法,对离散事件的模拟算法,还有计算机主机和外部设 ...
- web前端学习笔记(CSS固定宽度布局)
一.单列布局: 这是最简单的一种布局方式,之所以给出该示例,还是为了保证本篇博客的完整性. <html xmlns="http://www.w3.org/1999/xhtml" ...
- Android反编译(三)之重签名
Android反编译(三) 之重签名 [目录] 1.原理 2.工具与准备工作 3.操作步骤 4.装X技巧 5.问题 1.原理 1).APK签名的要点 a.所有的应用程序都必须有数字证书 ,Androi ...
- Windows Azure Virtual Machine (27) 使用psping工具,测试Azure VM网络连通性
<Windows Azure Platform 系列文章目录> 微软Azure在设计架构的时候,从安全角度考虑,是禁用ICMP协议的.所以对于Azure VM,是无法使用ping命令的. ...