zoukankan      html  css  js  c++  java
  • 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:ConsoleApplication1inDebugquartz.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!");
            }
        }
    }

  • 相关阅读:
    JavaScript 浮点数处理
    从输入URL到浏览器显示页面发生了什么
    hadoop 编译任意版本的eclipse 插件
    Stm32F103面向对象编程之GPIO
    flume 1.7 安装与使用
    HIVE分组排序问题
    MapReduce实现共同朋友问题
    hadoop项目实战--ETL--(三)实现mysql表到HIVE表的全量导入与增量导入
    hadoop项目实战--ETL--(二)实现自动向mysql中添加数据
    hadoop项目实战--ETL--(一)项目分析
  • 原文地址:https://www.cnblogs.com/gb2013/p/QuartzNET-Quick-Start-Guide.html
Copyright © 2011-2022 走看看