Quartz.NET——作业调度组件

时间:2022-09-20 14:06:38
之前有个旧同事说他在项目中碰到某些功能需要使用到作业调度,于是找到了这个组件,据说相当好用,叫我有时间的话去了解一下。哈,于是小了解了一下,基本的使用算是明白了,深层次的东西就不了解了,本文简单记录一下最基本的使用!
    关于Quartz.NET,请访问它的网站:http://quartznet.sourceforge.net    下载Quartz.NET,请直接进这里:http://quartznet.sourceforge.net/download.html     首先看下在什么情况下我们会需要使用Quartz.NET来进行作业调度。在业务系统中,我们需要在每天的某一个时间点(例如晚上12点)中做一些统计报表的生成(例如生成当前的一些报表之类~);或者在网站中定时更新静态页面;或者在CRM中会在某些特殊的日子给予提醒。总之这些在根据预定好的时间规则里要去做某些事情的需求,都是可以用这个来解决的,当然了,前提是你开发的东西用的是.NET- -!
配置
    使用Quartz.NET,我们需要在配置文件里面添加点东西,首先是configSections节点中,我们要添加已下内容:
xml代码
1
2
3
4
<section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<sectionGroup name="common">
  <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging"/>
</sectionGroup>
    从上面添加的节点可以知道,肯定还有一些节点要添加的,在configuration节点中添加如下:
xml代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<common>
  <logging>
    <factoryAdapter type="Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter, Common.Logging">
      <arg key="showLogName" value="true"/>
      <arg key="showDataTime" value="true"/>
      <arg key="level" value="DEBUG"/>
      <arg key="dateTimeFormat" value="HH:mm:ss:fff"/>
    </factoryAdapter>
  </logging>
</common>
<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"/>
</quartz>

注:以上的配置我还没有去仔细研究,我是在网上找中文资料抄的 - -!

Quartz.NET中几个重要的东西
 
1、作业调度器接口 IScheduler:这个接口负责启动一个作业和关闭一个作业,在启动和关闭作业之前,它还需要接受两个东西,一个是触发器(Trigger),一个是工作任务(JobDetail),要得到一个这样的接口的实例,我们还需要一个作业调度器工厂(ISchedulerFactory)。
2、作业调度器工厂接口 ISchedulerFactory:从命名来看,很明显是个工厂,专门产出IScheduler接口。
3、工作任务 JobDetail:它定义了你要定时去做什么工作,初始化一个该类的对象,我们要指定工作名(name),工作的组名(group),还有就是一个实现了IJob接口的类的类型(Type),就是说JobD定义的是做什么。
 
4、触发器 Trigger:据说Quartz.NET的触发器有很多,但是一般我们使用的是两种(都是继承了Trigger类的子类),一个是CronTrigger、另外一个是SimpleTrigger,我们要指定触发器名(name),触发器的的职责是定义工作任务的触发规则,也就是说Trigger定义的是啥时候做。
 
5、工作接口 IJob:我们需要把定时要做的事情(业务逻辑,例如去写一下数据库,写一下文件之类的)包装在一个类里面,这个类有一个特点,就是继承IJob这个接口,实现该接口的唯一方法Execute(JobExecutionContext context),在这个方法中将尽情地用代码实现我们的业务,所以可以说这个接口定义的是如何做。     
 
    网上找的资料基本一上来就是代码,没有对几个重要的对象就行讲解,这点比较遗憾!通过上面我们基本可以猜想出写出来的代码会是怎么样:我们先定义个类去实现IJob接口,把要做的“工作”写好,然后从作业调度器工厂(ISchedulerFactory)中拿个作业调度器(IScheduler)出来,定义好工作任务(JobDetail)指定这个工作任务的工作就是我们定义的那个类,定义好触发器(Trigger,也许是用CronTrigger、也许是用SimpleTrigger),把工作任务和触发器交给作业调度器,这样一来,就确定了在什么时候要去做什么,也知道要怎么做了,最后调用作业调度器的一个方法(Statr())来开始任务!
代码示例
    下面用代码来说明问题,我们用代码来完成这样一个需求:在web项目中有一个txt文件(文件名为JobNotePad.txt),每隔十秒钟就把当前时间记录在里面。这里我们使用CronTrigger这种触发器来完成任务。首先我们要实现IJob接口,定义一个类如下:
c#代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using Quartz;
namespace WebApplication.Common
{
    public class MyJob : IJob
    {
        public void Execute(JobExecutionContext context)
        {
            try
            {           
                var path = @"H:\代码\测试代码\Csharp测试\QuartzTest\WebApplication\WebApplication\JobNotePad.txt";
                var curText = System.IO.File.ReadAllText(path);
                System.IO.File.WriteAllText(path, curText + "\r\n" + DateTime.Now.ToString());
            }
            catch (Exception ex)
            {
                throw;
            }
        }
    }
}

代码很简单,往txt文件里面写入当前时间。注意这里文件的路径,我直接用了物理路径,因为Quartz.NET的工作是在它自己启的独立进程里面跑的,所以没办法通过当前的上下文对象把虚拟路径转为物理路径,也就是说var path = System.Web.HttpContext.Current.Server.MapPath("~/JobNotePad.txt");这样的代码会报错!这个大家可以去体会一下~~~
    接着我们要在Global.asax文件里写点代码,在网站开启的时候就开始作业,于是在Application_Start中加入如下代码:

c#代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/// <summary>
/// 作业调度器接口
/// </summary>
IScheduler scheduler;
protected void Application_Start(object sender, EventArgs e)
{
    try
    {
        // 创建一个工作调度器工场
        ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
        // 获取一个任务调度器
        scheduler = schedulerFactory.GetScheduler();
        // 创建一个工作
        JobDetail job = new JobDetail("jobname1", "jobgroup1", typeof(Common.MyJob));
        // 创建一个触发器
        CronTrigger trigger = new CronTrigger();
        trigger.Name = "trigger1";
        trigger.JobName = "jobname1";
        trigger.JobGroup = "jobgroup1";
        trigger.Group = "triggergroup1";
        trigger.CronExpression = new CronExpression("0/10 * * * * ?");
        scheduler.AddJob(job, true);
        DateTime ft = scheduler.ScheduleJob(trigger);
        scheduler.Start();
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

这里我们发现把IScheduler的实例定义在方法外面了,理由是我们要在Application_End中用到它,如下(关闭作业调度):

c#代码
1
2
3
4
protected void Application_End(object sender, EventArgs e)
{
    scheduler.Shutdown(true);
}

代码中有个地方比较有趣,就是trigger.CronExpression = new CronExpression("0/10 * * * * ?");这句,表示的是每隔10秒执行一次,从0秒开始,也就是说每个10秒、20秒、30秒...会fire一次工作。关于这个时间,这里有篇文章讲得很好,http://www.cnblogs.com/gooddasenlin/archive/2011/04/06/2007084.html    修改一下需求,现在是要一秒钟内执行一次,执行10次就结束,我们可以使用另外一个触发器(SimpleTrigger)来完成任务,修改Application_Start代码如下:

c#代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
protected void Application_Start(object sender, EventArgs e)
{
    try
    {
        ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
        scheduler = schedulerFactory.GetScheduler();
        JobDetail job = new JobDetail("jobname1", "jobgroup1", typeof(Common.MyJob));
        // 创建一个触发器
        SimpleTrigger trigger = new SimpleTrigger();
        trigger.Name = "trigger1";
        trigger.JobName = "jobname1";
        trigger.JobGroup = "jobgroup1";
        trigger.Group = "triggergroup1";
        trigger.RepeatInterval = new TimeSpan(0, 0, 1);
        trigger.RepeatCount = 10;
        scheduler.AddJob(job, true);
        DateTime ft = scheduler.ScheduleJob(trigger);
        scheduler.Start();
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

可以看到,我们其实只改了触发器的类型和触发器触发时间的定义。使用这两种触发器基本可以满足我们的需求了!
    测试代码,我们只需要运行网站,然后查看根目录下的JobNotePad.txt文件就知道鸟!

Quartz.NET——作业调度组件的更多相关文章

  1. Quartz&period;NET作业调度框架详解&lpar;转&rpar;

    Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性而不牺牲 ...

  2. &period;net Quartz 服务 作业调度

    .net项目中使用Quartz   (1)在web.config中进行相关配置 <configSections> <section name="quartz" t ...

  3. &period;NET Core开源Quartz&period;Net作业调度框架实战演练

    一.需求背景 人生苦短,我用.NET Core!作为一枚后端.NET开发人员,项目实践常遇到定时Job任务的工作,在Windows平台最容易想到的的思路Windows Service服务应用程序,而在 ...

  4. 用Quartz进行作业调度(转)

    概述 各种企业应用几乎都会碰到任务调度的需求,就拿论坛来说:每隔半个小时生成精华文章的RSS文件,每天凌晨统计论坛用户的积分排名,每隔30分钟执行锁定用户解锁任务. 对于一个典型的MIS系统来说,在每 ...

  5. Quartz&period;NET作业调度框架详解

    Quartz.NET作业调度框架详解 http://www.cnblogs.com/lmule/archive/2010/08/28/1811042.html

  6. Java使用quartz实现作业调度

    在spring boot中使用quartz实现作业调度的功能,简单易用. 什么是Quartz? Quartz是Java领域最著名的.功能丰富的.开放源码的作业调度工具,几乎可以在所有的Java应用程序 ...

  7. quartz开源作业调度框架的配置

    quartz开源作业调度框架的job服务实现,Quartz是一个完全由java编写的开源作业调度框架,使用时候需要创建一个实现org.quartz.Job接口的java类,Job接口包含唯一的方法: ...

  8. 一个基于swoole的作业调度组件,已经实现了redis和rabitmq队列消息存储。

    https://github.com/kcloze/swoole-jobs 一个基于swoole的作业调度组件,已经实现了redis和rabitmq队列消息存储.参考资料:swoole https:/ ...

  9. &period;net core quartz job作业调度管理组件

    定时作业对于多数系统来说,都会用到,定时作业的实现方式可以有多种方式,简单的方式用Timer就可以实现,但是达不到通用的效果,本文采用Quartz基础组件来搭建一套企业通用的作业调度管理服务,希望对于 ...

随机推荐

  1. ANE 从入门到精通 --- 一键打包ANE

    每次都要执行好几步才能编译出ANE很是麻烦,使用如下脚本 一键完成复杂的流程 REM 好压HaoZipC文件所在的位置,7Zip,WinRAR等均可 Set Zip=D:\"Program ...

  2. K-Means 聚类算法原理分析与代码实现

    前言 在前面的文章中,涉及到的机器学习算法均为监督学习算法. 所谓监督学习,就是有训练过程的学习.再确切点,就是有 "分类标签集" 的学习. 现在开始,将进入到非监督学习领域.从经 ...

  3. vmware vcenter appliance dhcp 改为 静态IP导致web service认证失败

    参考 http://www.davidhill.co/2012/09/failed-to-connect-to-vmware-lookup-service/ Failed to connect to ...

  4. C&num; 钩子HOOK专题&lpar;1&rpar;

    目录   基本概念 运行机制 钩子类型 作者 基本概念   钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程 ...

  5. OPENSHIFT V3 免费部署 Java-Web

    OpenShift是红帽的云开发平台即服务(PaaS).*和开放源码的云计算平台使开发人员能够创建.测试和运行他们的应用程序,并且可以把它们部署到云中.Openshift广泛支持多种编程语言和框架, ...

  6. Java中常见的排序方法

    本博主要介绍Java中几种常见的排序算法: /* 排序方法的演示1)插入排序(直接插入排序.希尔排序)2)交换排序(冒泡排序.快速排序)3)选择排序(直接选择排序.堆排序)4)归并排序5)分配排序(基 ...

  7. &lbrack;AtCoder arc090E&rsqb;Avoiding Collision

    Description 题库链接 给出一张 \(N\) 个节点, \(M\) 条边的无向图,给出起点 \(S\) 和终点 \(T\) .询问两个人分别从 \(S\) 和 \(T\) 出发,走最短路不相 ...

  8. android——error opening trace file&colon; No such file or directory &lpar;2&rpar;

    1.疑惑: 程序运行起来的时候日志总是显示下面这个错误,但是不影响程序的正常进行,我是用真机来测试的,android4.4.4(API17). 02-11 14:55:03.629 15525-155 ...

  9. &lbrack;Aaronyang紫色博客&rsqb; 写给自己的WPF4&period;5-Blend5公开课系列 2-更进一步

     我的文章一定要做到对读者负责,否则就是失败的文章  ---------   www.ayjs.net    aaronyang技术分享 欢迎大家支持我的力作<[Aaronyang] 写给自己的 ...

  10. 201621123008 《Java程序设计》第14周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 2. 使用数据库技术改造你的系统 2.1 简述如何使用数据库技术改造你的系统.要建立什么表?截图你的表设计. 分 ...