Quartz.net(调度框架) 使用Mysql作为存储

最近公司的做的项目中涉及到配置任务地址然后按照配置去目标地址提取相关的数据,所以今天上午在Internet上查看有关定时任务(调度任务)的相关信息,筛选半天然后查找到Quartz.net。

Quartz.net概述:

Quartz.net是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等。 Quartz.NET允 许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。整合了 Quartz.NET的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业。

接下来说一下怎么安装并使用:

1、首先建立一个名称为“TestQuartz.net”的控制台项目,然后使用Nuget安装Quartz.net,

由于项目中使用Mysql存储调度框架的相关,所以需要下载Quartz.net能用的mysql .net数据驱动文件。

这个是对应关系:

  • SqlServer-20 - SQL Server driver for .NET Framework 2.0
  • OracleODP-20 - Oracle's Oracle Driver
  • OracleODPManaged-1123-40 Oracle's managed driver for Oracle 11
  • OracleODPManaged-1211-40 Oracle's managed driver for Oracle 12
  • MySql-50 - MySQL Connector/.NET v. 5.0 (.NET 2.0)
  • MySql-51 - MySQL Connector/:NET v. 5.1 (.NET 2.0)
  • MySql-65 - MySQL Connector/:NET v. 6.5 (.NET 2.0)
  • SQLite-10 - SQLite ADO.NET 2.0 Provider v. 1.0.56 (.NET 2.0)
  • Firebird-201 - Firebird ADO.NET 2.0 Provider v. 2.0.1 (.NET 2.0)
  • Firebird-210 - Firebird ADO.NET 2.0 Provider v. 2.1.0 (.NET 2.0)
  • Npgsql-20 - PostgreSQL Npgsql

经过我反复测试MySql-65对应的驱动版本为:MySql.Data 6.5.4 版本。

这下在vs的“工具”菜单中找到“NUGET程序包管理器”并点击“程序包管理控制台”

打开界面如下:

输入 Install-Package MySql.Data -Version 6.5.4 并输入回车安装

2、在项目中新建DemoJob的类并继承IJob接口(Ijob是Quartz.net的接口)

代码如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using Quartz;
 7 
 8 namespace TestQuartz.net
 9 {
10     public class DemoJob : IJob
11     {
12         public void Execute(IJobExecutionContext context)
13         {
14             Console.WriteLine(string.Format("{0}执行一次", DateTime.Now));
15         }
16     }
17 }

 然后打开“Program.cs”的类文件,并编辑为如下代码:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Collections.Specialized;
 4 using System.IO;
 5 using System.Linq;
 6 using System.Text;
 7 using System.Threading;
 8 using System.Threading.Tasks;
 9 using Common.Logging;
10 using Quartz;
11 using Quartz.Impl;
12 
13 namespace TestQuartz.net
14 {
15     public class Program
16     {
17         static void Main(string[] args)
18         {
19             IntQuartz();
20 
21         }
22         static void IntQuartz()
23         {
24             //1.首先创建一个作业调度池
25             var properties = new NameValueCollection();
26             //存储类型
27             properties["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX,Quartz";
28             //表明前缀
29             properties["quartz.jobStore.tablePrefix"] = "QRTZ_";
30             //驱动类型
31             properties["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.MySQLDelegate,Quartz";
32             //数据源名称
33             properties["quartz.jobStore.dataSource"] = "myDS";
34             //连接字符串
35             properties["quartz.dataSource.myDS.connectionString"] = "Server=192.168.0.141;Database=test;Uid=root;Pwd=root";
36             //版本
37             properties["quartz.dataSource.myDS.provider"] = "MySql-65";
38             //最大链接数
39             //properties["quartz.dataSource.myDS.maxConnections"] = "5";
40             // First we must get a reference to a scheduler
41             var schedulerFactory = new StdSchedulerFactory(properties);
42             var scheduler = schedulerFactory.GetScheduler();
43             scheduler.Start();
44         }
45     }
46 }

 

3、需要我们在MySql中建立数据库和相应的数据表,不用发愁开源的项目中作者已为我们准备好了数据库建立表的语句(打开此链接并复制数据库语句执行)。

有啦数据库后你会很兴奋,直接写t-sql操作数据库多么便捷啊,并且所有的任务调度信息都一目了然,这里我要告诉你的事,你不需要直接写sql语句,quart提供的类库就能自动对数据库进行填充,以完成对任务调度的管理操作。

4、操作事例:

添加一个任务并开始执行,代码如下:

 1  private static void Insert()
 2         {
 3 
 4             IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
 5             DateTime StarTime = DateTime.Now;
 6             DateTimeOffset starRunTime = DateBuilder.NextGivenSecondDate(StarTime, 1);
 7             DateTime EndTime = DateTime.MaxValue.AddDays(-1);
 8             DateTimeOffset endRunTime = DateBuilder.NextGivenSecondDate(EndTime, 1);
 9             IJobDetail job = JobBuilder.Create<DemoJob>()
10               .WithIdentity("j1", "g1")
11               .WithDescription("注释")
12               .Build();
13             ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
14                                          .StartAt(starRunTime)//指定运行时间
15                                          .EndAt(endRunTime)//指定结束时间
16                                          .WithIdentity("j1", "g1")
17                                          .WithCronSchedule("0/5 * * * * ?")//运行模式 每十秒钟运行一次
18                                          .WithDescription("注释")
19                                          .Build();
20             scheduler.ScheduleJob(job, trigger);
21             scheduler.Start();
22         }
View Code

 

其他:

 
IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
//删除任务代码
var trigger = new TriggerKey("j1", "g1"); scheduler.PauseTrigger(trigger);//停止触发器 scheduler.UnscheduleJob(trigger); //移除触发器 scheduler.DeleteJob(JobKey.Create(jobName, jobGroup));

//暂停单个任务
scheduler.PauseJob(JobKey.Create(jobName, jobGroup));

//暂停所有任务
scheduler.PauseAll();

//开启指定任务
scheduler.ResumeJob(JobKey.Create(jobName, jobGroup));

//开启所有任务
scheduler.ResumeAll();

//是否集群
properties["quartz.jobStore.clustered"] = "true";
properties["quartz.scheduler.instanceId"] = "AUTO";

 

5、Quartz的cron表达式

 官方英文介绍地址:http://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/crontrigger.html

cron expressions 整体上还是非常容易理解的,只有一点需要注意:"?"号的用法,看下文可以知道“?”可以用在 day of month 和 day of week中,他主要是为了解决如下场景,如:每月的1号的每小时的31分钟,正确的表达式是:* 31 * 1 * ?,而不能是:* 31 * 1 * *,因为这样代表每周的任意一天。


由7段构成:秒 分 时 日 月 星期 年(可选)
"-" :表示范围  MON-WED表示星期一到星期三
"," :表示列举 MON,WEB表示星期一和星期三
"*" :表是“每”,每月,每天,每周,每年等
"/" :表示增量:0/15(处于分钟段里面) 每15分钟,在0分以后开始,3/20 每20分钟,从3分钟以后开始
"?" :只能出现在日,星期段里面,表示不指定具体的值
"L" :只能出现在日,星期段里面,是Last的缩写,一个月的最后一天,一个星期的最后一天(星期六)
"W" :表示工作日,距离给定值最近的工作日
"#" :表示一个月的第几个星期几,例如:"6#3"表示每个月的第三个星期五(1=SUN...6=FRI,7=SAT)

官方实例

 
ExpressionMeaning
0 0 12 * * ? 每天中午12点触发
0 15 10 ? * * 每天上午10:15触发
0 15 10 * * ? 每天上午10:15触发
0 15 10 * * ? * 每天上午10:15触发
0 15 10 * * ? 2005 2005年的每天上午10:15触发
0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发
0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发
0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发
0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发
0 15 10 ? * MON-FRI 周一至周五的上午10:15触发
0 15 10 15 * ? 每月15日上午10:15触发
0 15 10 L * ? 每月最后一日的上午10:15触发
0 15 10 L-2 * ? Fire at 10:15am on the 2nd-to-last last day of every month
0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发
0 15 10 ? * 6L Fire at 10:15am on the last Friday of every month
0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发
0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发
0 0 12 1/5 * ? Fire at 12pm (noon) every 5 days every month, starting on the first day of the month.
0 11 11 11 11 ? Fire every November 11th at 11:11am.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 至此事例项目已搭建完毕!

执行结果效果图:

实测在开几个客户端下也不会都去执行。而是集中在某个客户端下执行。

 

项目开源地址:https://github.com/quartznet/quartznet

posted @ 2016-05-16 15:06  xingbo  阅读(4050)  评论(1编辑  收藏  举报