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文件中  ,首先引入需要的命名空间:

1     using Quartz;
2     using Quartz.Impl;
3     using Quartz.Job;
4     using System.Threading;
5
6     using OxyPlot;
7     using OxyPlot.Axes;
8     using OxyPlot.Series;

  重载一个带参数的Form1构造方法:

 1         private bool isFirst = true;
 2         public Form1(string msg)
 3         {
 4             InitializeComponent();
 5             _msg = msg;
 6             try
 7             {
 8                 //启动 scheduler
 9                 scheduler.Start();
10                 // 定义一个job并和自定义的HelloJob进行绑定
11                 IJobDetail job = JobBuilder.Create<HelloJob>()
12                     .WithIdentity("HelloJob", "SimpleGroup")
13                     .Build();
14                 #region Cron Expressions
15                // ITrigger trigger2 = TriggerBuilder.Create()
16                //.WithIdentity("trigger3", "group1")
17                //.WithCronSchedule(" 0 0/5 * * * ?", x => x
18                //    .WithMisfireHandlingInstructionFireAndProceed())
19                //.ForJob("job1", "group1")
20                //.Build();
21                 #endregion
22
23                 //定义一个即时触发的触发器,(每隔1秒进行重复执行)
24                 ITrigger trigger= TriggerBuilder.Create()
25                     .WithIdentity("trigger1", "SimpleGroup")
26                     .StartNow()
27                     .WithSimpleSchedule(x => x
28                         .WithIntervalInSeconds(1)
29                         .RepeatForever())
30                     .Build();
31                 // 将job和trigger进行绑定,并告知 quartz 调度器用trigger去执行job
32                 scheduler.ScheduleJob(job, trigger);
33             }
34             catch (SchedulerException se)
35             {
36                 Console.WriteLine(se);
37             }
38
39         }

  在Form1的FormClosed事件,即窗体关闭后,将scheduler关闭:

1         private void Form1_FormClosed(object sender, FormClosedEventArgs e)
2         {
3             //关闭 scheduler
4             scheduler.Shutdown();
5         }

  在窗体加载时,创建一个时序图:

 1         public OxyPlot.WindowsForms.PlotView  Plot;
 2         private LineSeries lineSeries = new LineSeries { Title = "即时监控(1秒)", StrokeThickness =2 };
 3         private void Form1_Load(object sender, EventArgs e)
 4         {
 5             Plot = new OxyPlot.WindowsForms.PlotView();
 6             Plot.Model = new PlotModel();
 7             Plot.Dock = DockStyle.Fill;
 8             this.panel1.Controls.Add(Plot);
 9
10             Plot.Model.PlotType = PlotType.XY;
11             Plot.Model.Background = OxyColor.FromRgb(255, 255, 255);
12             Plot.Model.TextColor = OxyColor.FromRgb(0, 0, 0);
13
14             // add Series and Axis to plot model
15             Plot.Model.Series.Add(lineSeries);
16             Plot.Model.Axes.Add(new LinearAxis());
17         }

  定义一个SetMsg方法来更新消息:

 1         private double xInit = 0;
 2         public bool SetMsg(string msg)
 3         {
 4             _msg = msg;
 5             //号称NET4最简单的跨进程更新UI的方法
 6             this.Invoke((MethodInvoker)delegate
 7             {
 8                 // runs on UI thread
 9                 if (isFirst)
10                 {
11                     this.txtLog.AppendText("Hello to Quartz NET ! Created by JackWang 2015");
12                     isFirst = false;
13                 }
14                 this.txtLog.AppendText(string.Format("\r\n$JackWang>> You get {0} message from Quartz MyJob...", _msg));
15                 xInit = xInit + 1;
16                 lineSeries.Points.Add(new DataPoint(xInit,double.Parse(_msg)));
17                 if (lineSeries.Points.Count > 50)
18                 {
19                     //保留最近50个点
20                     lineSeries.Points.RemoveAt(0);
21                 }
22                  //更新图表数据
23                 this.Plot.Model.InvalidatePlot(true);
24
25             });
26             return true;
27
28         }

2.3 定义一个HelloJob

  在带参数的Form1构造方法中 , 创建的HelloJob的定义为:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Windows.Forms;
 6 namespace QuartzDemo
 7 {
 8     using Quartz;
 9     using Quartz.Impl;
10     using Quartz.Job;
11     public  class HelloJob : IJob
12     {
13         private static Form1 __instance = null;
14         public  void Execute(IJobExecutionContext context)
15         {
16
17             if (isOpen("Form1"))
18             {
19                 //获取当前Form1实例
20                 __instance = (Form1)Application.OpenForms["Form1"];
21                 //随机生成小于100的数
22                 string num = new Random().Next(100).ToString();
23                 //通过方法更新消息
24                 __instance.SetMsg(num);
25             }
26             else
27             {
28                 //__instance = new Form1("0");
29                 //__instance.Show();
30
31             }
32
33         }
34         /// <summary>
35         /// 判断窗体是否打开
36         /// </summary>
37         /// <param name="appName"></param>
38         /// <returns></returns>
39         private  bool isOpen(string appName)
40         {
41             FormCollection collection = Application.OpenForms;
42             foreach (Form form in collection)
43             {
44                 if (form.Name == appName)
45                 {
46                     return true;
47                 }
48             }
49             return false;
50         }
51     }
52 }

  注意修改Program.cs中用带参数的Form1构建方法进行实例创建:

1         [STAThread]
2         static void Main()
3         {
4             Application.EnableVisualStyles();
5             Application.SetCompatibleTextRenderingDefault(false);
6             Application.Run(new Form1("0"));
7         }

3 最终效果

  最终效果如下 , 每隔1秒,就是用随机的数来更新文本框和图表中的内容:

  值得注意的是,如果用下面的代码格式,必须保证二者的名称完全一致,否则无法实现任务和触发器的绑定.

时间: 2024-08-26 21:05:14

Quartz.NET开源作业调度框架系列(一):快速入门step by step-转的相关文章

Quartz.NET开源作业调度框架系列

Quartz.NET是一个被广泛使用的开源作业调度框架 , 由于是用C#语言创建,可方便的用于winform和asp.net应用程序中.Quartz.NET提供了巨大的灵活性但又兼具简单性.开发人员可用它快捷的创建并执行一个自动化作业.Quartz.NET有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等. 针对Quartz.NET的使用,从基础入门,Cron表达式,不同job间进行参数传递进行了介绍,并对插件任务进行了描述,最后将AdoJobStore如何保持到数据库中进行

Quartz.NET开源作业调度框架系列(三):IJobExecutionContext 参数传递-转

前面写了关于Quartz.NET开源作业调度框架的入门和Cron Trigger , 这次继续这个系列, 这次想讨论一下Quartz.NET中的Job如何通过执行上下文(Execution Contex)进行参数传递 , 有些参数想保存状态该如何处理 . 在Quartz.NET中可以用JobDataMap进行参数传递.本例用Quartz.NET的任务来定期轮询数据库表,当数据库的条目达到一定的数目后,进行预警.(其实可以将读取的表和预警条件配置到数据库中的预警条件表中,这样就可以简单实现一个自动

Quartz.NET开源作业调度框架系列(二):CronTrigger-转

CronTriggers比SimpleTrigger更加的灵活和有用,对于比较复杂的任务触发规则,例如"每个星期天的晚上12:00"进行备份任务,SimpleTrigger就不能胜任,只能选择CronTriggers.利用CronTrigger, 你不但能实现在"每个星期天的晚上12:00"进行备份的任务,还可以执行  "在每个星期一/星期三/星期五的上午9:00到10:00期间每隔5 分钟"进行某个自动化任务. 1 Cron Expressio

Quartz.net开源作业调度框架使用详解(转)

前言 quartz.net作业调度框架是伟大组织OpenSymphony开发的quartz scheduler项目的.net延伸移植版本.支持 cron-like表达式,集群,数据库.功能性能强大更不用说. 下载项目文档官网:http://www.quartz-scheduler.net/ 项目中需引用:Common.Logging.dll , Common.Logging.Core.dll , Quartz.dll 下面给大家分解下我最近做的关于计划调度的一个小项目,来辅助理解quartz.n

Quartz.net开源作业调度框架使用详解

前言 quartz.net作业调度框架是伟大组织OpenSymphony开发的quartz scheduler项目的.net延伸移植版本.支持 cron-like表达式,集群,数据库.功能性能强大更不用说. 下载项目文档官网:http://www.quartz-scheduler.net/ 项目中需引用:Common.Logging.dll , Common.Logging.Core.dll , Quartz.dll 下面给大家分解下我最近做的关于计划调度的一个小项目,来辅助理解quartz.n

Quartz.net开源作业调度

Quartz.net开源作业调度框架使用详解 前言 quartz.net作业调度框架是伟大组织OpenSymphony开发的quartz scheduler项目的.net延伸移植版本.支持 cron-like表达式,集群,数据库.功能性能强大更不用说. 下载项目文档官网:http://www.quartz-scheduler.net/ 项目中需引用:Common.Logging.dll , Common.Logging.Core.dll , Quartz.dll 下面给大家分解下我最近做的关于计

微服务的入门级微框架Spring Boot快速入门

详情请交流  QQ  709639943 00.微服务的入门级微框架Spring Boot快速入门 00.基于java的微信公众号二次开发视频教程 00.leetcode 算法 面试 00.北风网 零基础到数据(大数据)分析专家-首席分析师 00.快速上手JMeter 00.Jmeter 00.2017年Java web开发工程师成长之路 00.R语言速成实战 00.R语言数据分析实战 00.Python+Django+Ansible Playbook自动化运维项目实战 00.Java深入微服务

CTK框架——CTK Widgets快速入门

CTK框架--CTK Widgets快速入门 一.CTK Widgets模块简介 1.CTK Widgets模块简介 CTK Widgets模块是CTK封装的用于通用功能以及生物医学成像专用领域的Qt组件库.CTK中所有部分都有大量的测试相关代码,在源码目录下Libs/xxx/Testin/Cpp目录中.CTK官方文档:http://www.commontk.org/docs/html/modules.htmlImageGallery演示了CTK Widgets模块大部分组件的效果:http:/

其他主流开源硬件简介BeagleBone Black快速入门

其他主流开源硬件简介BeagleBone Black快速入门 1.3 其他主流开源硬件简介 开源硬件种类繁多,但主要有两款开源硬件常与BeagleBone比较.它们就是Arduino和Raspberry Pi(即树莓派).之所以常拿他们来比较,是因为他们有共同点也有不同点.在笔者看来,他们之间可以互相补充,但是均是不可替代的.下面就来简单介绍一下这两种开源硬件本文选自BeagleBone Black快速入门教程. 1.3.1  Arduino Arduino常被用来称呼Arduino的硬件控制器