Quartz.net 2.0 2012年4月9日发布了Released版本,到目前(2014-12-08)为止是2.3版

Quartz.net 项目地址:http://www.quartz-scheduler.net/

官方2.x 教程:http://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/index.html

Quartz.net 2.x在.net中的使用

Quartz.net 的介绍和下载网上很多。Quartz.net是一个开源的专门用来处理我们日常所说的定时任务,就像你想让程序某些时间去做一些事情(例如:每天晚上0点的时候定时给领导发数据邮件)。

首先新建一个控制台应用程序:

第二步,添加Quartz.net的引用(有以下2种方式)

一、Quartz.net的引用可以自己下载dll自行引用(这里要提醒一下,quartz.net还依赖于Common.Logging.dll,同时版本要一致,下载可以去官方下载:http://www.quartz-scheduler.net/ 和Common.Logging连同一起)

二、直接使用NuGet添加引用

在搜索处输入quartz.net搜索安装即可(目前是2.3)

同上图可以看到它有个依赖项Common.Logging,安装时会自动将Common.Logging也安装上,所以推荐使用NuGet的引用方式。

当然NuGet你也可以通过命令的方式安装:Install-Package Quartz

开始之前先来说一下Quartz.net的配置(Configuration)

也有几种方式 (以下是自己的理解+翻译:http://www.quartz-scheduler.net/documentation/quartz-2.x/quick-start.html)

1、在你的程序中使用NameValueCollection的方式给定时器工厂(scheduler factory)提供参数

2、在程序的config文件中使用quartz配置节

3、在程序的根目录上使用一个命名为quartz.config的文件

三种方式其实是一样的,都是提供键值对的参数值 (方便以后修改的话,建议使用2或者3)

例如使用quartz.config 会看到是如下大概的形式:

quartz.scheduler.instanceName = MyScheduler

quartz.threadPool.threadCount = 3

quartz.jobStore.type = Quartz.Simpl.RAMJobStore, Quartz

上面简单的意思就是

定时器的名字是MyScheduler,线程池中分配3个线程,也就是说同时最多只能有3个任务在执行,第3个配置是任务的存储类型,因为默认Quartz的所有数据(JobDetail、triggers)是保存在内存中的,上面是配置存入数据库(可以去下载quartz.net的源码,你会看到它提供了相关的建表的语句,可以直接使用它的表,当然是靠配置去使用-------表有点多,并且我目前的业务没有那么复杂,如果使用,我会选择自己建表存储)。

第三步、下面开始一个简单的任务

我还是按照官方的教程一步一步来,将控制台的Program.cs修改成如下代码:

using System.Threading.Tasks;
using Quartz;
using Quartz.Impl; namespace Quartz001
{
class Program
{ static void Main(string[] args)
{
//配置Common.Logging的日志输出为控制台的方式
Common.Logging.LogManager.Adapter = new Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter { Level = Common.Logging.LogLevel.Info }; try
{
//通过工厂得到Scheduler的一个实例
IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler(); //开启
scheduler.Start(); Thread.Sleep(TimeSpan.FromSeconds()); //关闭定时器
scheduler.Shutdown(); Console.ReadKey();
}
catch (SchedulerException ex)
{
Console.WriteLine(ex);
}
}
}
}

F5运行,输出

上面只是Quartz.net的最简单的开启和关闭

下面添加一个执行任务,Quartz的任务也很简单,只需要让任务类继承并实现IJob接口

右击控制台应用程序添加一个类HelloJob.cs

using Quartz;

namespace Quartz001
{
public class HelloJob:IJob
{
public void Execute(IJobExecutionContext context)
{
Console.WriteLine("我来自HelloJob任务");
}
}
}

然后对Program.cs代码做一些修改:

using System.Threading.Tasks;
using Quartz;
using Quartz.Impl; namespace Quartz001
{
class Program
{ static void Main(string[] args)
{
//配置Common.Logging的日志输出为控制台的方式
Common.Logging.LogManager.Adapter = new Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter { Level = Common.Logging.LogLevel.Info }; try
{
//通过工厂得到Scheduler的一个实例
IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler(); //开启
scheduler.Start(); //使用JobBuilder合建一个任务并和我们的HelloJob绑定在一起(注意Job的Key-相当于唯一标识)
IJobDetail job = JobBuilder.Create<HelloJob>()
.WithIdentity("job1", "group1")
.Build(); //任务触发器--StartNow()立即执行,执行间隔10s,一直执行
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartNow()
.WithSimpleSchedule(x => x.WithIntervalInSeconds()
.RepeatForever())
.Build(); //告诉Quartz用上面的触发器去定时执行job
scheduler.ScheduleJob(job, trigger); Thread.Sleep(TimeSpan.FromSeconds()); //关闭定时器
scheduler.Shutdown();
}
catch (SchedulerException ex)
{
Console.WriteLine(ex);
} Console.WriteLine("按任意键退出!");
Console.ReadKey();
}
}
}

执行结果:

此时一个简单的定时任务就完成了

job任务里面,还可以通过JobDataMap往job中传递值

如新建一个DumbJob.cs任务

using Quartz;

namespace Quartz001
{
public class DumbJob:IJob
{
public void Execute(IJobExecutionContext context)
{
JobKey key = context.JobDetail.Key; JobDataMap dataMap = context.JobDetail.JobDataMap; string jobSays = dataMap.GetString("jobSays");
float myFloatValue = dataMap.GetFloat("myFloatValue"); Console.Error.WriteLine("DumbJob的任务实例说:" + jobSays + "值是:" + myFloatValue);
}
}
}

修改Program.cs文件代码

using System.Threading.Tasks;
using Quartz;
using Quartz.Impl; namespace Quartz001
{
class Program
{ static void Main(string[] args)
{
//配置Common.Logging的日志输出为控制台的方式
Common.Logging.LogManager.Adapter = new Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter { Level = Common.Logging.LogLevel.Info }; try
{
//通过工厂得到Scheduler的一个实例
IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler(); //开启
scheduler.Start(); //使用JobBuilder合建一个任务并和我们的HelloJob绑定在一起(注意Job的Key-相当于唯一标识)
IJobDetail job = JobBuilder.Create<HelloJob>()
.WithIdentity("job1", "group1")
.Build(); //任务触发器--StartNow()立即执行,执行间隔10s,一直执行
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartNow()
.WithSimpleSchedule(x => x.WithIntervalInSeconds()
.RepeatForever())
.Build(); IJobDetail dumbJob = JobBuilder.Create<DumbJob>()
.WithIdentity("myJob", "dumbGroup")
.UsingJobData("jobSays", "我是DumbJob,大家好!")
.UsingJobData("myFloatValue", 3.141f)
.Build();
//还可以使用下面的方式传递数据
//JobDataMap map = jobDetail.JobDataMap;
//map.Put("jobSays", "我是DumbJob,大家好!"); ITrigger dumbTrigger = TriggerBuilder.Create()
.StartNow()
.WithSimpleSchedule(x=>x.WithIntervalInSeconds().WithRepeatCount()) //3秒钟执行一次,执行3次(加上启动的一次,输出会有4次)
.Build(); //告诉Quartz用上面的触发器去定时执行job
scheduler.ScheduleJob(job, trigger);
scheduler.ScheduleJob(dumbJob, dumbTrigger); Thread.Sleep(TimeSpan.FromSeconds()); //关闭定时器
scheduler.Shutdown();
}
catch (SchedulerException ex)
{
Console.WriteLine(ex);
} Console.WriteLine("按任意键退出!");
Console.ReadKey();
}
}
}

输出结果:

源码下载

学习参阅资料:

http://www.cnblogs.com/lzrabbit/archive/2012/04/13/2447609.html

http://www.cnblogs.com/Raymond-YYC/p/3975378.html

http://www.cnblogs.com/monian/p/3822980.html

http://geekswithblogs.net/TarunArora/archive/2013/01/20/quartz.net-scheduler-exposed-via-a-web-service.aspx

最新文章

  1. iOS APP可执行文件的组成
  2. 烂泥:智能DNS使用与配置
  3. PKU 1003解题
  4. 【iCore3 双核心板_ uC/OS-III】例程六:信号量——共享资源
  5. [转]iOS学习之UINavigationController详解与使用(一)添加UIBarButtonItem
  6. 设计模式_Flyweight_享元模式
  7. enum类型被intent所携带时需要注意的地方
  8. 网站开发常用jQuery插件总结(二)弹出层插件Lightbox
  9. Markdown转pdf
  10. 数据库文件*.sdf文件定时备份,但是大小的增量在不断增长的问题排查
  11. JBOSS EAP 6 系列四 EJB实现——调用(贯穿始终的模块)
  12. UIViewController/ApplicationSequ…
  13. CF343D Water Tree
  14. 爬虫之Resquests模块的使用(二)
  15. Java中常见的IO流及其使用
  16. jdk版本不一致问题
  17. javascript 基础知识-1
  18. Vue 编程之路(一)——父子组件之间的数据传递
  19. 51nod1805 小树 prufer序列 + 容斥原理
  20. JavaScript------表单约束验证DOM方法

热门文章

  1. RadioButton实现多选一
  2. Jexus部署Asp.Net Core项目
  3. Map类集合
  4. DESUtil 加密算法
  5. 配置管理puppet
  6. Java 学习笔记(121208)
  7. WordCounter Python实现
  8. 【SQL查询】按照多个字段进行排序_order by
  9. Markdown转HTML之Node篇
  10. 8.var目录下的文件和目录详解