Quartz.net 2.x 学习笔记01

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(10));   

                //关闭定时器
                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(10)
                        .RepeatForever())
                    .Build();

                //告诉Quartz用上面的触发器去定时执行job
                scheduler.ScheduleJob(job, trigger);

                Thread.Sleep(TimeSpan.FromSeconds(60));

                //关闭定时器
                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(10)
                        .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(3).WithRepeatCount(3))   //3秒钟执行一次,执行3次(加上启动的一次,输出会有4次)
                    .Build();

                //告诉Quartz用上面的触发器去定时执行job
                scheduler.ScheduleJob(job, trigger);
                scheduler.ScheduleJob(dumbJob, dumbTrigger);

                Thread.Sleep(TimeSpan.FromSeconds(60));

                //关闭定时器
                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

时间: 2024-11-09 14:47:29

Quartz.net 2.x 学习笔记01的相关文章

【opengl 学习笔记01】HelloWorld示例

<<OpenGL Programming Guide>>这本书是看了忘,忘了又看,赶脚还是把笔记做一做心里比较踏实,哈哈. 我的主题是,好记性不如烂笔头. ================================================================ 1. 下载glut库 glut库地址为:www.opengl.org/resources/libraries/glut/glutdlls37beta.zip glut全称为:OpenGL Utilit

Quartz.NET 2.0 学习笔记(1) :Quartz.NET简介

转自:http://www.cnblogs.com/lzrabbit/archive/2012/04/13/2447609.html Quartz.NET 项目地址 http://quartznet.sourceforge.net/ Quartz.NET 2.0 学习笔记(1) :Quartz.NET简介 Quartz.NET 2.0 学习笔记(2) :和1.0的几点不同 Quartz.NET 2.0 学习笔记(3) :通过配置文件实现任务调度 Quartz.NET 2.0 学习笔记(4) :c

HTTP 学习笔记01

HTTP   hypertext transfer protocol (超文本传输协议) TCP/IP 协议集中的一个应用层协议 用于定义WEB浏览器与WEB服务器之间交换数据的过程以及数据本身的格式 HTTP 1.0  会话方式 HTTP 1.1 方式 HTTP 请求消息结构 一个请求行,若干消息头,以及实体内容 其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开. GET   方式下是没有实体内容的 POST .PUT.DELETE 方式下请求消息才可以包含实体内容 HT

SWIFT学习笔记01

1.Swift,用来判断option是不是nil,相当于OC的 if(option) if let name = option{ greeting = "if=====" }else{ greeting = "else===" } 2.运行switch中匹配到的子句之后,程序会退出switch语句,并不会继续向下运行,所以不需要在每个子句结尾写break. 3.//使用..创建的范围不包含上界,如果想包含的话需要使用...,集合上,就是[)与[]的关系 for i

C++ GUI Qt4学习笔记01

C++ GUI Qt4学习笔记01 qtc++signalmakefile文档平台 这一章介绍了如何把基本的C++只是与Qt所提供的功能组合起来创建一些简单的图形用户界面应用程序. 引入两个重要概念:一个是“信号和槽”,另一个是“布局”. 窗口部件(widget)是用户界面的一个可视化元素,相当于windows系统中的“控件”和“容器”.任意窗口部件都可以用作窗口. 1.1Hello Qt 正确安装Qt4开发环境,创建工程目录hello,源代码文件名为hello.cpp,进入hello目录 (1

HTML学习笔记01

HTML学习笔记 HTML学习笔记01 一.HTML的定义 1 HTML就是"HyperText Markup Language","超文本标记语言".2 HTML不是<color="red">编程语言,而是一种标记语言.3 标记语言是一套标记标签.4 HTML使用标记标签来描述网页. 二.HTML标签 1 HTML标签是由尖括号包围的关键词.2 HTML标签通常是成对出现的.3 标签对中的第一个标签是开始标签,第二个标签是结束标签.

MVC4 学习笔记01

1 . ASP.NET MVC 中 ActionResult 和 ViewResult 在使用上的区别是什么?要注意什么吗? ActionResult 是一个抽象(abstract)类,ViewResult 只是ActionResult 的一个实现(implementation).如果你确认你返回的是一个视图(view),你可以直接返回类型为ViewResult.ActionResult 有很多的派生类,如果你很确定你要返回的类型,你可以明确的返回该类型.如果你并不是很清楚,或者你根本不想去理解

python学习笔记(01):python和c语言 标识符命名规则比较

python标识符命名规则:标识符的第一个字符必须是字母表中的字母(大写或小写)或者一个下划线(‘ _ ’).标识符名称的其他部分可以由字母(大写或小写).下划线(‘ _ ’)或数字(0-9)组成.标识符名称是对大小写敏感的.例如,myname和myName不是一个标识符.注意前者中的小写n和后者中的大写N.有效 标识符名称的例子有i.__my_name.name_23和a1b2_c3.无效 标识符名称的例子有2things.this is spaced out和my-name. c语言标识符命

C++学习笔记——01

最近准备跳槽的事情,于是把C++翻出来看,顺便做了一些练习,主要是数据结构方面的,就贴在这里做个系列,权当督促自己了. 第一天,写了一个栈,调试了下没什么问题,内存泄露的问题也解决了. 1 #ifndef STACK_H 2 #define STACK_H 3 4 #include "stdlib.h" 5 #include "iostream" 6 7 class Stack 8 { 9 private: 10 typedef int NODE_DATA_TYPE