Quartz.Net 调度框架配置介绍

在平时的工作中,估计大多数都做过轮询调度的任务,比如定时轮询数据库同步,定时邮件通知等等。大家通过windows计划任务,windows服务等都实现过此类任务,甚至实现过自己的配置定制化的框架。那今天就来介绍个开源的调度框架Quartz.Net(主要介绍配置的实现,因为有朋友问过此类问题)。调度的实现代码很简单,在源码中有大量Demo,这里就略过了。

Quartz.Net当前最新版本 Quartz.NET 2.0 beta 1 Released

一 基于文件配置

先看一下简单的实现代码

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;using Quartz;using Quartz.Impl;using Common.Logging;

namespace Demo{    class Program    {        static void Main(string[] args)        {

            // First we must get a reference to a scheduler            ISchedulerFactory sf = new StdSchedulerFactory();            IScheduler sched = sf.GetScheduler();

            sched.Start();                      sched.Shutdown(true);

        }    }}

代码很简单,配置文件中的quartz基础配置,以及job,trigger信息是如何加载的?这个过程是发生 IScheduler sched = sf.GetScheduler();过程,主要体现在源码这一段

  public void Initialize()        {            // short-circuit if already initialized            if (cfg != null)            {                return;            }            if (initException != null)            {                throw initException;            }

            NameValueCollection props = (NameValueCollection) ConfigurationManager.GetSection("quartz");

            string requestedFile = Environment.GetEnvironmentVariable(PropertiesFile);            string propFileName = requestedFile != null && requestedFile.Trim().Length > 0 ? requestedFile : "~/quartz.config";

            // check for specials            propFileName = FileUtil.ResolveFile(propFileName);

            if (props == null && File.Exists(propFileName))            {                // file system                try                {                    PropertiesParser pp = PropertiesParser.ReadFromFileResource(propFileName);                    props = pp.UnderlyingProperties;                    Log.Info(string.Format("Quartz.NET properties loaded from configuration file ‘{0}‘", propFileName));                }                catch (Exception ex)                {                    Log.Error("Could not load properties for Quartz from file {0}: {1}".FormatInvariant(propFileName, ex.Message), ex);                }

            }            if (props == null)            {                // read from assembly                try                {                    PropertiesParser pp = PropertiesParser.ReadFromEmbeddedAssemblyResource("Quartz.quartz.config");                    props = pp.UnderlyingProperties;                    Log.Info("Default Quartz.NET properties loaded from embedded resource file");                }                catch (Exception ex)                {                    Log.Error("Could not load default properties for Quartz from Quartz assembly: {0}".FormatInvariant(ex.Message), ex);                }            }            if (props == null)            {                throw new SchedulerConfigException(                    @"Could not find <quartz> configuration section from your application config or load default configuration from assembly.Please add configuration to your application config file to correctly initialize Quartz.");            }            Initialize(OverrideWithSysProps(props));        }

通过上面代码分析,初始化首先会检查系统config中是否有<quartz> configuration section节点 (config指的app.config,web.config),如果系统config有quartz节点,则直接加载此处的配置信息。如果系统config没有quartz的基础配置信息,则会继续查找是否有quartz.config/Quartz.quartz.config 这两个配置文件的存在,如果有则加载配置信息,如果没有则扔出初始化配置异常。

而jobs.xml(调度的任务和触发器plugin节点配置文件)

app.config/web.config 中plugin配置

    <quartz>        <add key="quartz.scheduler.instanceName" value="ExampleDefaultQuartzScheduler"/>        <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz"/>        <add key="quartz.threadPool.threadCount" value="10"/>        <add key="quartz.threadPool.threadPriority" value="2"/>        <add key="quartz.jobStore.misfireThreshold" value="60000"/>        <add key="quartz.jobStore.type" value="Quartz.Simpl.RAMJobStore, Quartz"/>    <!--******************************Plugin配置********************************************* -->    <add key="quartz.plugin.xml.type" value="Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz" />    <add key="quartz.plugin.xml.fileNames" value="quartz_jobs.xml"/>     </quartz> 

quartz.config 中plugin配置指向(quartz.plugin.xml.type / quartz.plugin.xml.fileNames)

# You can configure your scheduler in either <quartz> configuration section# or in quartz properties file# Configuration section has precedence

quartz.scheduler.instanceName = ServerScheduler

# configure thread pool infoquartz.threadPool.type = Quartz.Simpl.SimpleThreadPool, Quartzquartz.threadPool.threadCount = 10quartz.threadPool.threadPriority = Normal

#--------------------------------*************plugin配置------------------------------------# job initialization plugin handles our xml reading, without it defaults are usedquartz.plugin.xml.type = Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartzquartz.plugin.xml.fileNames = ~/quartz_jobs.xml

# export this server to remoting contextquartz.scheduler.exporter.type = Quartz.Simpl.RemotingSchedulerExporter, Quartzquartz.scheduler.exporter.port = 555quartz.scheduler.exporter.bindName = QuartzSchedulerquartz.scheduler.exporter.channelType = tcpquartz.scheduler.exporter.channelName = httpQuartz

二 基于代码的方式

这种情况直接通过代码实现的,官方DEMO很多都是如此,我们举个例子

using System;using System.Collections.Generic;using System.Linq;using System.Text; using Quartz;using Quartz.Impl;using System.Threading;using Common.Logging;

namespace Demo{    class Program    {        static void Main(string[] args)        {            ILog log = LogManager.GetLogger(typeof(Demo.HelloJob));

            log.Info("------- Initializing ----------------------");

            // First we must get a reference to a scheduler            ISchedulerFactory sf = new StdSchedulerFactory();            IScheduler sched = sf.GetScheduler();

            log.Info("------- Initialization Complete -----------");

            //---------------------------------------代码添加job和trigger            // computer a time that is on the next round minute            DateTimeOffset runTime = DateBuilder.EvenMinuteDate(DateTimeOffset.UtcNow);

            log.Info("------- Scheduling Job  -------------------");

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

            // Trigger the job to run on the next round minute            ITrigger trigger = TriggerBuilder.Create()                .WithIdentity("trigger1", "group1")                .StartAt(runTime)                .Build();

            // Tell quartz to schedule the job using our trigger            sched.ScheduleJob(job, trigger);            log.Info(string.Format("{0} will run at: {1}", job.Key, runTime.ToString("r")));

            // Start up the scheduler (nothing can actually run until the             // scheduler has been started)            sched.Start();            log.Info("------- Started Scheduler -----------------");

            // wait long enough so that the scheduler as an opportunity to             // run the job!            log.Info("------- Waiting 65 seconds... -------------");

            // wait 65 seconds to show jobs            Thread.Sleep(TimeSpan.FromSeconds(65));

            // shut down the scheduler            log.Info("------- Shutting Down ---------------------");            sched.Shutdown(true);            log.Info("------- Shutdown Complete -----------------");        }    }}

其实代码方式已经实现了和配置文件混搭的方式了。但是这种对方式是通过配置关联加载job与trigger配置,我们还有第三种方式,自己加载job与trigger配置文件。

三 手动加载配置文件

using System;using System.Collections.Generic;using System.Linq;using System.Text; using Quartz;using Quartz.Xml;using Quartz.Impl;using Quartz.Simpl;using System.Threading;using Common.Logging;using System.IO;

namespace Demo{    class Program    {        static void Main(string[] args)        {                        XMLSchedulingDataProcessor processor = new XMLSchedulingDataProcessor(new SimpleTypeLoadHelper());           ISchedulerFactory sf = new StdSchedulerFactory();           IScheduler scheduler = sf.GetScheduler();

           Stream s = new StreamReader("~/quartz.xml").BaseStream;           processor.ProcessStream(s, null);           processor.ScheduleJobs(scheduler);

           scheduler.Start();           scheduler.Shutdown();

        }    }}

亦或者这样

using System.Text; using Quartz;using Quartz.Xml;using Quartz.Impl;using Quartz.Simpl;using System.Threading;using Common.Logging;using System.IO;

namespace Demo{    class Program    {        static void Main(string[] args)        {                        XMLSchedulingDataProcessor processor = new XMLSchedulingDataProcessor(new SimpleTypeLoadHelper());           ISchedulerFactory sf = new StdSchedulerFactory();           IScheduler scheduler = sf.GetScheduler();

           processor.ProcessFileAndScheduleJobs("~/quartz.xml",scheduler);

           scheduler.Start();           scheduler.Shutdown();

        }    }}

目前根据源码分析大致就这几种配置方式,很灵活可以任意组合。 关于quartz的使用源码很详细,并且园子量有大量的学习文章。

记住quartz的配置读取方式首先app.config/web.config ---->quartz.config/Quartz.quartz.config ---->quartz_jobs.xml .

通过代码方式我们可以改变quartz_jobs.xml 的指向即自己新命名的xml文件

(默认的quartz_jobs.xml是在XMLSchedulingDataProcessor.QuartzXmlFileName = "quartz_jobs.xml"被指定的)

方式一,通过quartz节点/quartz.config指向指定的jobs.xml。

方式二,通过XMLSchedulingDataProcessor 加载指定的jobs.xml

时间: 2024-10-29 19:07:32

Quartz.Net 调度框架配置介绍的相关文章

java计划任务调度框架quartz结合spring实现调度的配置实例代码分享

点击链接加入群[JavaEE(SSH+IntelliJIDE+Maven)]:http://jq.qq.com/?_wv=1027&k=L2rbHv 一:quartz简介 OpenSymphony 的Quartz提供了一个比较完美的任务调度解决方案. Quartz 是个开源的作业调度框架,定时调度器,为在 Java 应用程序中进行作业调度提供了简单却强大的机制. Quartz中有两个基本概念:作业和触发器.作业是能够调度的可执行任务,触发器提供了对作业的调度 二:quartz spring配置详

山寨版Quartz.Net任务统一调度框架

TaskScheduler 在日常工作中,大家都会经常遇到Win服务,在我工作的这些年中一直在使用Quartz.Net这个任务统一调度框架,也非常好用,配置简单,但是如果多个项目组的多个服务部署到一台服务器时还是不尽如人意. 这段时间很忙,也一直未更新博客了,赶上今天下班早,就研究了一下,弄了个简单版基于Timer的山寨Quartz,当然了只是实现任务调度,闲话少说直接入主题吧 一.技术准备 其实都是普通的微软技术,一想到这方我们第一想到的可能就是反射,本文用了MEF 二.框架搭建 第一我们建立

Quartz.net 开源job调度框架

Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET允许开发人员根据时间间隔(或天)来调度作业.它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联. 整合了 Quartz.NET的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业. 官方学习文档:http://www.quartz-scheduler.net/documentation/index.html 使用实例介绍:ht

Quartz.Net任务统一调度框架

山寨版Quartz.Net任务统一调度框架 TaskScheduler 在日常工作中,大家都会经常遇到Win服务,在我工作的这些年中一直在使用Quartz.Net这个任务统一调度框架,也非常好用,配置简单,但是如果多个项目组的多个服务部署到一台服务器时还是不尽如人意. 这段时间很忙,也一直未更新博客了,赶上今天下班早,就研究了一下,弄了个简单版基于Timer的山寨Quartz,当然了只是实现任务调度,闲话少说直接入主题吧 一.技术准备 其实都是普通的微软技术,一想到这方我们第一想到的可能就是反射

开源调度框架Quartz最佳实践

开源调度框架Quartz最佳实践 Quartz是一个Java调度框架,当前的最新版本为2.2.1. 以Quartz 2.2.1版为例,Quartz最佳实践(用于生产系统)总结如下: 1.跳过更新检查Quartz内置了一个“更新检查”特性,因此Quartz项目每次启动后都会检查官网,Quartz是否存在新版本.这个检查是异步的,不影响Quartz项目本身的启动和初始化.可以在Quartz配置文件中,设置org.quartz.scheduler.skipUpdateCheck的属性为true来跳过更

spring框架整合使用定时任务框架java quartz的示例代码配置

原创整理不易,转载请注明出处:spring框架整合使用定时任务框架java quartz的示例代码配置 代码下载地址:http://www.zuidaima.com/share/1775583461723136.htm 有时候我们的任务(Job)需要再某些任务完成之后才能进行:例如从旧的数据库批量导数据的时候:需要现将被其他数据依赖的数据导入新的数据库:然后再进行关系的导入..在这种情况下我们就可以使用Quartz的listener来做文章了. 首先我们写一个主任务的类,命名为MainJob:她

作业流 oozie调度框架的配置与使用(一)

一: 常见的调度框架 一: oozie 概述与功能 二: oozie 安装与配置 一: 常见的作用调度框架 1.1 linux 下面的计划任务 在工作量比较下的情况下 使用linux 下的crond 使用定制计划任务 * * * * * 后面接调度 job 的命令 分 时 日 月 周 hive -e " " 执行一个sql 命令 hive -f " " 执行一个sql 脚本 结合 crond 使用 1.2 常见的协作调度框架: 1.2.1 Azkaban 框架 参考

详解应对平台高并发的分布式调度框架TBSchedule

tbschedule是一款非常优秀的高性能分布式调度框架,非常高兴能分享给大家.这篇文章是我结合多年tbschedule使用经验和研读三遍源码的基础上完成的,期间和阿里空玄有过不少技术交流,非常感谢空玄给予的大力支持.我写这篇文章的目的一是出于对tbschedule的一种热爱,二是现在是一个资源共享.技术共享的时代,希望把它展现给大家(送人玫瑰,手留余香),能给大家的工作带来帮助. 一.tbschedule初识 时下互联网和电商领域,各个平台都存在大数据.高并发的特点,对数据处理的要求越来越高,

JEESZ分布式框架--技术介绍文档

摘要: 1.Eclipse IDE:采用Maven项目管理,模块化.     2.代码生成:通过界面方式简单配置,自动生成相应代码,目前包括三种生成方式(增删改查):单表.一对多.树结构.生成后的代码如果不需要注意美观程度,生成后即可用. Rest服务,Redis,Spring,SpringMVC+Mybatis,Dubbo+Zookeeper,Java分布式架构 分布式.微服务.云架构,Spring,SpringMVC,Spring MVC+Mybatis,Dubbo+Zookeeper,Re