zoukankan      html  css  js  c++  java
  • 作业调度框架 Quartz.NET 2.0 StepByStep

    :目前网上诸多介绍Quartz.net的文章,甚至Quartz.net官网上的Tutorial都是1.0版本的,而这个项目在2.0版本对项目进行了比较大规模的修改,使得原有的很多例子都不能运行,故写此文。由于本人是边学边用,加之技术写作水平皆有限,错误自然难免,望轻拍,我将不定时更新完善此贴,希望能为需要的朋友提供帮助。

    1. 项目介绍

         现今的系统,业务数据是越来越大,传统的同步处理方式有时候已经不能满足用户需求,定时后台服务这种异步数据处理形式则逐渐被大家接受。相信大家在平时的工作中也经常遇到数据同步,或是定时邮件,短信提醒等需求,Quartz.net(官网 http://quartznet.sourceforge.net/)可以很好满足对多个windows服务的管理及监控,同时在保证开发简单的情况下不失灵活,是非常优秀的作业调度框架。

    和其他绝大多数开源项目一样Quartz.net也包含了其他几个优秀的开源项目:

    核心   ----Common.Logging(通用日志接口)

             ----C5(泛型集合类)

    示例程序

             ----log4net(日志记录-通用日志接口实现)

             ----topshelf(跨平台服务宿主程序)

      Quartz.net使用的许可是Apache License,商业友好,使用者可以修改源码用于开源或商业项目,只需包含许可及修改说明。

    2. Quartz.net开发思路
     
      我们来了解下Quartz.net中常用的几个概念:

      Scheduler  ---------主调度程序 --------- Quartz核心

      Job        ---------作业  --------- 服务要做的(业务操作)

      Trigger     ---------触发器  --------- 服务执行条件(何时执行操作)

      Listener    ---------事件监听器  --------- 执行期事件(Job执行前后/ Scheduler启动终止暂停时应该做什么,可以挂一些特定事件)

      了解了这些概念之后,我们就可以组合这些概念并整理出开发的思路:

      先利用SchedulerFactory构建一个Scheduler,启动Scheduler,之后构建Job和Trigger,若有作业监听需求,在Listener上添加相应的处理程序,再将Job和Trigger关联后放入Scheduler

    3. Quartz.net的简单使用

                   1. 新建一个控制台程序,引用Quartz.dll和Common.Logging.dll

                   2. 新建一个类,命名为SampleJob,继承并实现接口Quartz.IJob         

    View Code
    public class SampleJob : IJob
    {
    public void Execute(IJobExecutionContext context)
    {
    File.AppendAllText("C:\\Quartz.txt", "SampleJob Is Run");
    File.AppendAllText("C:\\Quartz.txt", Environment.NewLine);
    }
    }

                  3.在Program.cs的main方法中写如下代码后运行这个控制台会程序会发现已经SampleJob中的Execute方法已经执行

    View Code

    4. 使用topshelf创建WINDOWS服务

          此部分张善友同学已经写过 (http://www.cnblogs.com/shanyou/archive/2011/05/04/2037008.html),此节为保证思路连贯,简单介绍并引用部分代码  

      也许有的网友会疑问,以控制台程序作为服务宿主还没有意义的,这时轮到Topshelf出场了, 使用它可以很方便的构建跨平台服务寄主,而在调试时直接以控制台的形式运行即可,非常方便。 我们引入topshelf.dll及 log4net.dll(topshelf需要),将之前main中代码放到服务类里,把main方法变为Host构建

                 服务类代码:

    View Code

                修改后的Main代码

    View Code
     

                编译后,cmd进到exe所在目录,并执行"项目名.exe install/uninstall" 完成服务的安装与卸载

    通过上一篇文章,相信大家对Quartz.Net有了基本的了解,并可以建立最简单的服务了。本篇将着重讲解其中的Trigger,也就是如何设定服务的触发条件。

    按照情景,我在工作中一般会遇到以下几种情景

    1.服务开始时执行

      这个Trigger我们在上篇的实例中已经使用过,话不多说,直接上代码

    ITrigger trigger = TriggerBuilder.Create().StartNow().Build()

    2.在指定时间间隔内轮询执行

       利用框架中自带的SimpleTriggerImpl,就能轻松实现这类型触发器构造,下面列出常用的几个构造重载:

    • SimpleTriggerImpl(string name, int repeatCount, TimeSpan repeatInterval)
    • SimpleTriggerImpl(string name, DateTimeOffset startTimeUtc, DateTimeOffset? endTimeUtc, int repeatCount, TimeSpan repeatInterval)

       例如:

    View Code

       这个触发器的含义是,开始时间为立即开始(需要UTCNOW)+结束时间无+重复次数1(注意是重复次数JOB会执行两次)+轮询间隔10秒

    3.日轮询执行

       利用框架中自带的DailyTimeIntervalTriggerImpl,就能轻松实现这类型触发器构造,下面列出常用的几个构造重载:

    • DailyTimeIntervalTriggerImpl(String name, TimeOfDay startTimeOfDayUtc, TimeOfDay endTimeOfDayUtc, IntervalUnit intervalUnit, int repeatInterval)
    • DailyTimeIntervalTriggerImpl(string name, DateTimeOffset startTimeUtc,DateTimeOffset? endTimeUtc, TimeOfDay startTimeOfDayUtc, TimeOfDay endTimeOfDayUtc, IntervalUnit intervalUnit, int repeatInterval)

        例如:

    View Code

        这个触发器的含义是,开始时间为立即开始(需要UTCNOW)+结束时间无+每天凌晨1点开始每天22:01分结束+每分钟轮询+重复次数1+仅每周一执行

    4.复杂的时间设定

       如果想构建有如SqlServerJob设置般灵活的时间设定,那么就需要用到CronTriggerImpl这个类了,使用方法很简单,直接在构造里放入Cron表达式即可

    ITrigger trigger = new CronTriggerImpl("CronTrigger", "TriggerGroup1", "0 0 12 * * ?");

      这个触发器的含义是,每天中午12点执行

      注:这部分小弟未曾深入了解,加之这部分API也没有修改,就不班门弄斧了。请自行搜索Cron表达式/Cron expression

    http://www.cnblogs.com/Magicsky/archive/2012/02/08/2342806.html

  • 相关阅读:
    Reactor模式
    libcurl安装
    libcurl
    http概述
    添物不花钱学JavaEE(基础篇) --HTML
    Android BGABadgeView:BGABadgeFrameLayout(5)
    添物不花钱学计算机及编程(预备篇)— 总述
    Android BGABadgeView:BGABadgeImageView以及BGABadgeRelativeLayout(4)
    Android RoundedBitmapDrawable:Android官方的圆角图形图象实现方案
    Android BGABadgeView:BGABadgeLinearLayout以整体线性布局作为BadgeView(3)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2343359.html
Copyright © 2011-2022 走看看