Quartz.NET简介及入门指南

Quartz.NET简介

Quartz.NET是一个功能完备的开源调度系统,从最小的应用到大规模的企业系统皆可适用。

Quartz.NET是一个纯净的用C#语言编写的.NET类库,是对非常流行的JAVA开源调度框架 Quartz 的移植。

入门指南

本入门指南包括以下内容:

  • 下载 Quartz.NET
  • 安装 Quartz.NET
  • 根据你的特定项目配置 Quartz
  • 启动一个样例程序

下载和安装

你可以下载 zip 文件或使用 Nuget 程序包。Nuget 程序包只包含 Quartz.NET 运行所必须的二进制文件,zip 文件则包含源码、普通示例程序和 Quartz.NET 的服务端示例程序。

Nuget程序包

没有什么比这个更简单的了。只需要打开 Visual Studio (前提是安装了Nuget)并且从包管理器中添加 Quartz 的引用即可,步骤如下:

  • 在项目的引用上右键单击选择“管理Nuget程序包”
  • 选择“浏览”选项卡,在搜索框中输入“Quartz”并回车
  • 选择 Quartz 并在右侧点击安装即可。

或者用 Nuget 命令行工具,输入如下指令:

Install-Package Quartz

配置Quartz.NET

这是很重要的一步,Quartz.NET 是一个配置灵活的类库。有三种提供Quartz.NET配置信息的方式(三种方式之间并不是互相排斥的):

  • 通过提供 NameValueCollection 形式的参数以编程的形式来调度工厂;
  • 通过在标准的应用程序配置文件(形如youapp.exe.config)中添加 quartz-element 相关配置节;
  • 在应用程序根目录中添加 quartz.config

你可以在Quartz.NET 的zip 文件中找到以上三种配置形式的例子。

为了快速地启用示例,一个基本的 quartz.config 应包含如下内容:

quartz.scheduler.instanceName = MyScheduler

quartz.threadPool.threadCount = 3

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

要记得将此文件在 Visual Studio 的文件属性的“复制到输出目录”设置为“总是复制”,否则将会因配置文件缺失而导致程序运行失败。

这个配置文件创建的调度器有以下特性:

  • quartz.scheduler.instanceName - 这个调度器的名称将是 "MyScheduler".
  • quartz.threadPool.threadCount - 调度器将会在线程池中启用3个线程,这意味着最多只能有3个任务同时运行。
  • quartz.jobStore.type - 所有Quartz的相关数据,例如任务和触发器的详细信息将会保存在内存中(而不是数据库中)。即使你有一个数据库并且想在Quartz中使用它,我也建议你先以内存模式运行Quartz直到你开启了一个使用数据库工作的新次元。

实际上你并不需要去人为指定这些属性,Quartz.NET 拥有健全的默认配置信息。

开始一个示例程序

在你下载并安装 Quartz.NET 之后,便可以开始着手编写一个示例程序了。以下代码包含了一个调度器实例,开启它并随后关闭了它。

Program.cs


public class Program
{
    private static void Main(string[] args)
    {
        try
        {
            // Grab the Scheduler instance from the Factory
            IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();

            // and start it off
            scheduler.Start();

            // some sleep to show what‘s happening
            Thread.Sleep(TimeSpan.FromSeconds(60));

            // and last shut down the scheduler when you are ready to close your program
            scheduler.Shutdown();
        }
        catch (SchedulerException se)
        {
            Console.WriteLine(se);
        }
    }
}

当你使用 StdSchedulerFactory.GetDefaultScheduler() 获取到一个调度器实例后,由于后台还会有一个活动线程(非守护线程)存在,你的程序将不会通过默认情况关闭直到你调用了 scheduler.Shutdown()。

添加日志

Common.Logging的底层可以通过配置来使用不同的日志框架,即 Enterprise Library, Log4Net 和 NLog。

但是为了使示例保持简单我们选择了最简单的途径,通过代码实现调用 Common.Logging 的基础日志机制将日志输出到控制台。

在 Program.cs 中添加以下内容:

Common.Logging.LogManager.Adapter = new Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter { Level = Common.Logging.LogLevel.Info};

尝试启动应用程序并添加任务

现在当我们启动应用程序的时候可以得到类似下面的日志输出:

11.1.2014 14:52:04 [INFO] Quartz.Impl.StdSchedulerFactory - Quartz.NET properties loaded from configuration file ‘c:\ConsoleApplication1\bin\Debug\quartz.config‘
11.1.2014 14:52:04 [INFO] Quartz.Impl.StdSchedulerFactory - Using default implementation for object serializer
11.1.2014 14:52:04 [INFO] Quartz.Impl.StdSchedulerFactory - Using default implementation for ThreadExecutor
11.1.2014 14:52:04 [INFO] Quartz.Core.SchedulerSignalerImpl - Initialized Scheduler Signaller of type: Quartz.Core.SchedulerSignalerImpl
11.1.2014 14:52:04 [INFO] Quartz.Core.QuartzScheduler - Quartz Scheduler v.2.2.1.400 created.
11.1.2014 14:52:04 [INFO] Quartz.Simpl.RAMJobStore - RAMJobStore initialized.
11.1.2014 14:52:04 [INFO] Quartz.Core.QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.2.1.400) ‘MyScheduler‘ with instanceId ‘NON_CLUSTERED‘ Scheduler class: ‘Quartz.Core.QuartzScheduler‘ - running locally. NOT STARTED. Currently in standby mode. Number of jobs executed: 0 Using thread pool ‘Quartz.Simpl.SimpleThreadPool‘ - with 3 threads. Using job-store ‘Quartz.Simpl.RAMJobStore‘ - which does not support persistence. and is not clustered.
11.1.2014 14:52:04 [INFO] Quartz.Impl.StdSchedulerFactory - Quartz scheduler ‘MyScheduler‘ initialized
11.1.2014 14:52:04 [INFO] Quartz.Impl.StdSchedulerFactory - Quartz scheduler version: 2.2.1.400
11.1.2014 14:52:04 [INFO] Quartz.Core.QuartzScheduler - Scheduler MyScheduler_$_NON_CLUSTERED started.

 

我们创建一个简单的 HelloJob 任务来测试功能,这个任务将输出问候信息到控制台:

public class HelloJob : IJob
{
        public void Execute(IJobExecutionContext context)
               {
                        Console.WriteLine("Greetings from HelloJob!");
               }
}

我们来做一些更有趣的事情,在 Start() 之后线程休眠之前我们加入一些代码:


// define the job and tie it to our HelloJob class
IJobDetail job = JobBuilder.Create<HelloJob>()
    .WithIdentity("job1", "group1")
    .Build();

// Trigger the job to run now, and then repeat every 10 seconds
ITrigger trigger = TriggerBuilder.Create()
    .WithIdentity("trigger1", "group1")
    .StartNow()
    .WithSimpleSchedule(x => x
        .WithIntervalInSeconds(10)
        .RepeatForever())
    .Build();

// Tell quartz to schedule the job using our trigger
scheduler.ScheduleJob(job, trigger);

下面是一个完整的控制台程序内容:


using System;
using System.Threading;

using Quartz;
using Quartz.Impl;
using Quartz.Job;

namespace ConsoleApplication1
{
    public class Program
    {
        private static void Main(string[] args)
        {
            try
            {
                Common.Logging.LogManager.Adapter = new Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter {Level = Common.Logging.LogLevel.Info};

                // Grab the Scheduler instance from the Factory
                IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();

                // and start it off
                scheduler.Start();

                // define the job and tie it to our HelloJob class
                IJobDetail job = JobBuilder.Create<HelloJob>()
                    .WithIdentity("job1", "group1")
                    .Build();

                // Trigger the job to run now, and then repeat every 10 seconds
                ITrigger trigger = TriggerBuilder.Create()
                    .WithIdentity("trigger1", "group1")
                    .StartNow()
                    .WithSimpleSchedule(x => x
                        .WithIntervalInSeconds(10)
                        .RepeatForever())
                    .Build();

                // Tell quartz to schedule the job using our trigger
                scheduler.ScheduleJob(job, trigger);

                // some sleep to show what‘s happening
                Thread.Sleep(TimeSpan.FromSeconds(60));

                // and last shut down the scheduler when you are ready to close your program
                scheduler.Shutdown();
            }
            catch (SchedulerException se)
            {
                Console.WriteLine(se);
            }

            Console.WriteLine("Press any key to close the application");
            Console.ReadKey();
        }
    }

    public class HelloJob : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            Console.WriteLine("Greetings from HelloJob!");
        }
    }
}

时间: 2024-10-05 10:37:37

Quartz.NET简介及入门指南的相关文章

Ember.js 入门指南——model简介2

本文接上一篇<Ember.js 入门指南--model简介1>. 2,核心概念 声明:下面简介内摘抄至http://www.emberjs.cn/guides/models/#toc_. 1,store store是应用存放记录的中心仓库.你可以认为store是应用的所有数据的缓存.应用的控制器和路由都可以访问这个共享的store:当它们需要显示或者修改一个记录时,首先就需要访问store. DS.Store的实例会被自动创建,并且该实例被应用中所有的对象所共享. store可以看做是一个缓存

Quartz入门指南

看到官网的教程对于新手来说不够全面和连贯,因此结合自己的使用过程写下这个入门指南,用以解惑.本文基于Quartz2.2.2版本.请注意,本文为了易于上手,省略了许多重要的概念,建议阅读Quartz2.2.x官方教程. 一.安装与配置 下载.解压后,进入lib文件夹,将所有jar文件放入项目指定目录,然后在BuildPath中添加.Jar包共6个,如下所示. Quartz的运行依赖于log4j.xml和quartz.properties这两个配置文件.关于它们的配置方法,请查阅各自官网.我们偷个懒

Redis入门指南之简介

1. 简介 Redis是一个开源的.高性能的.基于键值对的缓存与存储系统,通过提供多种键值数据类型来适应不同的场景下的缓存与存储需求.同时Redis的诸多高级功能使其可以胜任消息队列.任务队列等不同的角色. 2. 特性 为什么Redis能吸引如此多的用户? (1)存储结构 在python中有一种数据结构字典,如代码dict["key"] = "value"中dict是一个字典结构变量,字符串"key"是键名,"value"是键

Ember.js 入门指南——路由简介

从本文开始,将为大家介绍路由(route),如果你看过前面的<Ember.js 入门指南--{{link-to}} 助手>这篇文章应该初步了解了route.不过在这篇文章中只是简单介绍了路由是定义.路由层次,更深入的route将从本文开始逐一介绍. 当用户使用你的应用时,应用要在不同的状态之间切换.Ember提供了很多工具用于管理那些因应用规模改变而改变的状态. 讲route前先了解URL,在应用中大概会会有如下方式设置URL: 用户第一次加载应用的时: 用户手动改变URL,比如点击按钮之后跳

Ember.js 入门指南——控制器(controller)

ember new chapter5_controllers cd chapter5_controllers ember server 从本篇开始进入第五章控制器,controller在Ember2.0开始越来越精简了,职责也更加单一--处理逻辑. 下面是准备工作. 从新创建一个Ember项目,仍旧使用的是Ember CLI命令创建. 在浏览器执行项目,看到如下信息说明项目搭建成功. Welcome to Ember 1,控制器简介 控制器与组件非常相似,由此,在未来的新版本中很有可能组件将会完

Ember.js 入门指南——总目录

Ember.js 是什么?我想对于想学习它的人应该知道它是个什么东西,如果你想了解那就赶紧去 Google 或者百度,本系列教程是通过学习官网教程然后摘抄个人觉得比较重要的部分,加上学习实例整合而成,如有疏漏欢迎提出修改意见,一起成长! Ember官网:http://emberjs.com/ 教程官网:http://guides.emberjs.com/v2.0.0/ 在此简单介绍下 Ember: Ember是一个雄心勃勃的Web应用程序,消除了样板,并提供了一个标准的应用程序架构的JavaSc

【HBase】HBase Getting Started(HBase 入门指南)

入门指南 1. 简介 Quickstart 会让你启动和运行一个单节点单机HBase. 2. 快速启动 – 单点HBase 这部分描述单节点单机HBase的配置.一个单例拥有所有的HBase守护线程-Master,RegionServers和ZooKeeper,运行一个单独JVM持久化到本地文件系统.这是我们最基础的部署文档.我们将会向你展示如何通过hbase shell CLI在HBase中创建一个表格,在表中插入行,执行put和scan操作,让表使能和启动和停止HBase等等操作. 除了下载

Microsoft Orleans 之 入门指南

Microsoft Orleans 在.net用简单方法构建高并发.分布式的大型应用程序框架. 原文:http://dotnet.github.io/orleans/ 在线文档:http://dotnet.github.io/orleans/What's-new-in-Orleans 源码地址:https://github.com/dotnet/orleans 简介:Orleans 框架可以构建大规模.高并发.分布式应用程序,而不需要学习专业分布式以及并发知识框架.它是由微软研究和设计应用于云计

sphinx中文入门指南 (转自sphinx中文站)

Sphinx中文入门指南 wuhuiming<blvming在gmail.com>,转载请注明来源和作者 最后修改:2010年1月23日 1.简介 1.1.Sphinx是什么 1.2.Sphinx的特性 1.3.Sphinx中文分词 2.安装配置实例 2.1 在GNU/Linux/unix系统上安装 2.1.1 sphinx安装 2.1.2.sfc安装(见另文) 2.1.3.coreseek安装(见另文) 2.2 在windows下安装 3. 配置实例 4.应用 4.1 在CLI上测试 4.2