Quartz.NET开源作业调度框架系列(一):快速入门step by step

简介: Quartz.NET是一个被广泛使用的开源作业调度框架 , 由于是用C#语言创建,可方便的用于winform和asp.net应用程序中。Quartz.NET提供了巨大的灵活性但又兼具简单性。开发人员可用它快捷的创建并执行一个自动化作业。Quartz.NET有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等。

  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 , 添加好类库后 , 项目文件如下图所示:

1.jpg

Quartz依赖库为Common.Logging和Common.Logging.Core  ,  二者需要一并导入 . 然后修改Form1的标题为QuartzDemo.

2.2 Form1定制

  在Form1设计视图上 , 为该窗体添加一个TextBox和Panel , 并设置相关属性(背景色,字体等) , 如下图所示:

2.jpg

  为了直观的执行定期任务 , 我们添加一个时序图(用Oxyplot控件) , 这里下载并引用Oxyplot.在Form1.cs文件中  ,首先引入需要的命名空间:

usingQuartz;
usingQuartz.Impl;
usingQuartz.Job;
usingSystem.Threading;
usingOxyPlot;
usingOxyPlot.Axes;
usingOxyPlot.Series;

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

privateboolisFirst=true;
publicForm1(stringmsg)
{
InitializeComponent();
_msg=msg;
try    {
//启动 schedulerscheduler.Start();
// 定义一个job并和自定义的HelloJob进行绑定IJobDetailjob=JobBuilder.Create<HelloJob>()
            .WithIdentity("HelloJob", "SimpleGroup")
            .Build();
#regionCronExpressions// ITrigger trigger2 = TriggerBuilder.Create()//.WithIdentity("trigger3", "group1")//.WithCronSchedule(" 0 0/5 * * * ?", x => x//    .WithMisfireHandlingInstructionFireAndProceed())//.ForJob("job1", "group1")//.Build();#endregion//定义一个即时触发的触发器,(每隔1秒进行重复执行)ITriggertrigger=TriggerBuilder.Create()
            .WithIdentity("trigger1", "SimpleGroup")
            .StartNow()
            .WithSimpleSchedule(x=>x                .WithIntervalInSeconds(1)
                .RepeatForever())
            .Build();
// 将job和trigger进行绑定,并告知 quartz 调度器用trigger去执行jobscheduler.ScheduleJob(job, trigger);
    }
catch (SchedulerExceptionse)
    {
Console.WriteLine(se);
    }
}

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

privatevoidForm1_FormClosed(objectsender, FormClosedEventArgse)
{
//关闭 schedulerscheduler.Shutdown();
}

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

publicOxyPlot.WindowsForms.PlotViewPlot;
privateLineSerieslineSeries=newLineSeries { Title="即时监控(1秒)", StrokeThickness=2 };
privatevoidForm1_Load(objectsender, EventArgse)
{
Plot=newOxyPlot.WindowsForms.PlotView();
Plot.Model=newPlotModel();
Plot.Dock=DockStyle.Fill;
this.panel1.Controls.Add(Plot);
Plot.Model.PlotType=PlotType.XY;
Plot.Model.Background=OxyColor.FromRgb(255, 255, 255);
Plot.Model.TextColor=OxyColor.FromRgb(0, 0, 0);
// add Series and Axis to plot modelPlot.Model.Series.Add(lineSeries);
Plot.Model.Axes.Add(newLinearAxis());
}

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

privatedoublexInit=0;
publicboolSetMsg(stringmsg)
{
_msg=msg;
//号称NET4最简单的跨进程更新UI的方法this.Invoke((MethodInvoker)delegate    {
// runs on UI threadif (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+1;
lineSeries.Points.Add(newDataPoint(xInit,double.Parse(_msg)));
if (lineSeries.Points.Count>50)
        {
//保留最近50个点lineSeries.Points.RemoveAt(0);
        }
//更新图表数据this.Plot.Model.InvalidatePlot(true);
    });
returntrue;
}

2.3 定义一个HelloJob

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

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
namespaceQuartzDemo{
usingQuartz;
usingQuartz.Impl;
usingQuartz.Job;
publicclassHelloJob : IJob    {
privatestaticForm1__instance=null;
publicvoidExecute(IJobExecutionContextcontext)
        {
if (isOpen("Form1"))
            {
//获取当前Form1实例__instance= (Form1)Application.OpenForms["Form1"];
//随机生成小于100的数stringnum=newRandom().Next(100).ToString();
//通过方法更新消息__instance.SetMsg(num);
            }
else            {
//__instance = new Form1("0");//__instance.Show();            }
        }
/// <summary>/// 判断窗体是否打开/// </summary>/// <param name="appName"></param>/// <returns></returns>privateboolisOpen(stringappName)
        {
FormCollectioncollection=Application.OpenForms;
foreach (Formformincollection)
            {
if (form.Name==appName)
                {
returntrue;
                }
            }
returnfalse;
        }
    }
}

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

[STAThread]
staticvoidMain()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(newForm1("0"));
}

3.jpg

3 最终效果


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

76497-20151130152030905-1464355915.gif

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

1.png

相关文章
|
2天前
|
消息中间件 开发框架 监控
NET任务调度框架Hangfire使用指南
Hangfire 是一个用于 .NET 应用程序的开源任务调度框架,支持长时间运行任务、定时任务等。通过简单的安装配置,即可将任务从主线程分离,提升应用性能。支持多种数据库,提供丰富的任务类型如立即执行、延迟执行和周期性任务,并有可视化管理界面 Hangfire Dashboard。还支持安全性配置及扩展插件,如 Hangfire.HttpJob,适合各种复杂场景下的任务调度需求。
20 1
NET任务调度框架Hangfire使用指南
|
21天前
|
开发框架 安全 .NET
在数字化时代,.NET 技术凭借跨平台兼容性、丰富的开发工具和框架、高效的性能及强大的安全稳定性,成为软件开发的重要支柱
在数字化时代,.NET 技术凭借跨平台兼容性、丰富的开发工具和框架、高效的性能及强大的安全稳定性,成为软件开发的重要支柱。它不仅加速了应用开发进程,提升了开发质量和可靠性,还促进了创新和业务发展,培养了专业人才和技术社区,为软件开发和数字化转型做出了重要贡献。
24 5
|
21天前
|
传感器 人工智能 供应链
.NET开发技术在数字化时代的创新作用,从高效的开发环境、强大的性能表现、丰富的库和框架资源等方面揭示了其关键优势。
本文深入探讨了.NET开发技术在数字化时代的创新作用,从高效的开发环境、强大的性能表现、丰富的库和框架资源等方面揭示了其关键优势。通过企业级应用、Web应用及移动应用的创新案例,展示了.NET在各领域的广泛应用和巨大潜力。展望未来,.NET将与新兴技术深度融合,拓展跨平台开发,推动云原生应用发展,持续创新。
27 4
|
21天前
|
开发框架 .NET C#
.NET 技术凭借高效开发环境、强大框架支持及跨平台特性,在软件开发中占据重要地位
.NET 技术凭借高效开发环境、强大框架支持及跨平台特性,在软件开发中占据重要地位。从企业应用到电子商务,再到移动开发,.NET 均展现出卓越性能,助力开发者提升效率与项目质量,推动行业持续发展。
24 4
|
22天前
|
开发框架 Java .NET
.net core 非阻塞的异步编程 及 线程调度过程
【11月更文挑战第12天】本文介绍了.NET Core中的非阻塞异步编程,包括其基本概念、实现方式及应用示例。通过`async`和`await`关键字,程序可在等待I/O操作时保持线程不被阻塞,提高性能。文章还详细说明了异步方法的基础示例、线程调度过程、延续任务机制、同步上下文的作用以及如何使用`Task.WhenAll`和`Task.WhenAny`处理多个异步任务的并发执行。
|
25天前
|
消息中间件 监控 数据可视化
基于.NET开源、功能强大且灵活的工作流引擎框架
基于.NET开源、功能强大且灵活的工作流引擎框架
|
25天前
|
网络协议 Unix Linux
精选2款C#/.NET开源且功能强大的网络通信框架
精选2款C#/.NET开源且功能强大的网络通信框架
|
3月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
45 7
|
3月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
72 0
|
4月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
53 0