在之前的文章《推荐一个简单、轻量、功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler》和《简单、轻量、功能非常强大的C#/ASP.NET定时调度任务执行管理组件–FluentScheduler之实例篇》中,我们认识和了解了FluentScheduler这款轻量的定时任务调度执行组件。今天再给大家介绍一款关于定时任务调度执行的组件–Quartz.Net,Quartz.Net是Java版Quartz的.NET实现。

相对FluentScheduler实现定时调度任务的使用简单,配置少的特点,Quartz.Net则配置稍微复杂一些。下面我们就接合一个 ASP.NET MVC网站应用程序的定时执行任务调试的小实例来了解Quartz.Net的简单用法,当然Webform的Web应用也是可以使用Quartz.Net 来作定时任务的。

首先,我们打开Visual Studio 2015,创建一个ASP.NET MVC的Web应用程序项目,命名为QuartzNetMvcDemo:

然后通过程序包管理器控制台来安装Quartz.Net组件:Install-Package Quartz

Quartz.Net一个最简单任务至少包括三部分实现:job(作业),trigger(触发器)以及scheduler(调度器)。其中job 是你需要在一个定时任务中具体执行的业务逻辑,trigger则规定job何时并按照何种规则执行,最终job和trigger会被注册到 scheduler(调度器)中,scheduler负责协调job和trigger的运行。

在Quartz.Net中,一个job(作业)即为一个类,为了让job能在Quartz.Net的体系中执行,我们必须实现Quartz.Net提供的IJob接口的Execute方法,如本例所实现的IJob接口ReportJob类:

代码入下:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
namespace Quartz.NetDemo
{
    public class ReportJob : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            var reportDirectory = string.Format("~/reports/{0}/", DateTime.Now.ToString("yyyy-MM"));
            reportDirectory = System.Web.Hosting.HostingEnvironment.MapPath(reportDirectory);
            if (!Directory.Exists(reportDirectory))
            {
                Directory.CreateDirectory(reportDirectory);
            }
            var dailyReportFullPath = string.Format("{0}report_{1}.log", reportDirectory, DateTime.Now.Day);
            var logContent = string.Format("{0}==>>{1}{2}", DateTime.Now, "create new log.", Environment.NewLine);
            File.AppendAllText(dailyReportFullPath, logContent);
        }
    }
}

Execute方法有一个IJobExecutionContext的接口对象作为参数,这个参数包含了定义这个类的job(作业)的配置信息。当然,作为示例,在本例中,我们没有使用到这个参数。

接下来,我们需要实现一个trigge(触发器),示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using Quartz;
using Quartz.Impl;
 
namespace QuartzNetMvcDemo
{
  public class ReportJobScheduler
  {
    public static void Start()
    {
      IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
      scheduler.Start();
      IJobDetail job = JobBuilder.Create<ReportJob>().Build();
      ITrigger trigger = TriggerBuilder.Create()
        .WithIdentity("triggerName""groupName")
        .WithSimpleSchedule(t =>
          t.WithIntervalInSeconds(5)
           .RepeatForever())
           .Build();
 
      scheduler.ScheduleJob(job, trigger);
    }
  }
}

这个代码片段你可以放在你项目程序的任何可以被调用的地方,类名你也可以随意取,这没有什么关系的。只要在使用这个类时正确引用即可。

在代码中,我们使用StdSchedulerFactory.GetDefaultScheduler()创建了一个scheduler(调度器) 并随之 启动了这个调度器,然后创建了一个简单的Quartz.Net触发器并对这个触发器进行了一些配置:指定了触发器的名称为triggerName,触发器 的分组为groupName,指定每5秒触发一次并一直循环触发。最后通过scheduler.ScheduleJob()方法把job(作业)和 trigger(触发器)注册到了调度器中,这样一个完整的定时任务就定制完成了。

最后,我们还要做的一件事情就是启动我们定制好的定时任务,我们把这个任务放到项目程序的全局cs文件(Global.asax)的Application_Start方法中来执行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
 
namespace QuartzNetMvcDemo
{
  public class MvcApplication : System.Web.HttpApplication
  {
    protected void Application_Start()
    {
      AreaRegistration.RegisterAllAreas();
      FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
      RouteConfig.RegisterRoutes(RouteTable.Routes);
      BundleConfig.RegisterBundles(BundleTable.Bundles);
       
      //启动定时任务
      ReportJobScheduler.Start();
    }
  }
}

好了,现在所有的操作都已完成,按下F5运行我们的ASP.NET MVC定时任务调度执行示例程序。过一分钟去打开我们的日志文件,如果程序正常运行,那么你将看到如下的日志

怎么样,Quartz.Net实现的定时执行任务调度是不是也比较简单呢?当然,这只是Quartz.Net的简单示例,Quartz.Net还有许多更高级的功能,如支持配置文件的作业调度,支持cron的作业周期等

Quartz.Net实现的定时执行任务调度的更多相关文章

  1. 基于MVC 的Quartz.Net组件实现的定时执行任务调度

    新建mvc项目之后,首先引用Quartz组件.工具-->NuGet包管理器-->管理解决方案的 NuGet包管理器 组件安装完成. Quartz.Net一个最简单任务至少包括三部分实现:j ...

  2. 基于ASP.NET MVC定时执行任务调度

    相对FluentScheduler实现定时调度任务的使用简单,配置少的特点,Quartz.Net则配置稍微复杂一些.下面我们就接合一个 ASP.NET MVC网站应用程序的定时执行任务调试的小实例来了 ...

  3. 基于ASP.NET MVC(C#)和Quartz.Net组件实现的定时执行任务调度

    http://www.cnblogs.com/bobositlife/p/aspnet-mvc-csharp-quartz-net-timer-task-scheduler.html 在之前的文章&l ...

  4. 用Quartz处理定时执行的任务

    这次做的项目中,有一部分功能需要实现定时执行.呃,这样说可能有点笼统,打个比方吧.例如用户在登录的时候,连续输错3次密码后,系统会将该用户冻结,不再允许该用户登录系统,等到了晚上零晨时分,再为所有被冻 ...

  5. 控制台基于Quartz.Net组件实现定时任务调度(一)

    前言: 你曾经需要应用执行一个任务吗?比如现在有一个需求,需要每天在零点定时执行一些操作,那应该怎样操作呢? 这个时候,如果你和你的团队是用.NET编程的话,可以考虑使用Quartz.NET调度器.允 ...

  6. Window服务基于Quartz.Net组件实现定时任务调度(二)

    前言: 在上一章中,我们通过利用控制台实现定时任务调度,已经大致了解了如何基于Quartz.Net组件实现任务,至少包括三部分:job(作业),trigger(触发器),scheduler(调度器). ...

  7. Quartz.net 定时任务在IIS中没有定时执行

    问题:Quartz.net 定时任务在项目部署到IIS中发现没有定时执行 解决方案: 1.在服务器上装一个360(自带自动刷新功能),在工具——>自动刷新——>自动刷新勾上 然后再设置一下 ...

  8. 使用laravel的任务调度(定时执行任务)

    laravel中有一个很强大上的功能,只需要在服务器上添加一个cron条目,就可以定时执行所有的laravel任务. 现在有如下数据表: 我想让cron表中的cron字段的值每分钟增加1,那么我需要如 ...

  9. 定时组件quartz系列<一>模拟定时组件小程序

    一.核心概念 Quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可. 1.Job表示一个工作,要执行的具体内容.此接口中只有一个方法void execute(Jo ...

随机推荐

  1. 转:浅谈Linux的内存管理机制

    一 物理内存和虚拟内存          我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概 ...

  2. Ubuntu更换主板之后 网络重新配置

    Ubuntu更换主板之后,网络不能用,需要重新配置 1.  首要要查看新主板的mac地址, dmesg | grep eth 2.  修改网络信息,该配置文件是/etc/udev/rules.d, 文 ...

  3. OCR简介及使用

    OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗.亮的模式确定其形状,然后用字符识别方法将形状翻译 ...

  4. centos mysql错误信息处理

    mysql_secure_installation 提示错误:Enter current password for root (enter for none):ERROR 1045 (28000): ...

  5. Hadoop-异常-Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/avro/io/DatumReader

    //maven org.apache.avr 下载不完全 ,去maven   If you are using maven to build your jar, you need to add the ...

  6. 运行计划中cost计算方法

    概念: blevel:二元高度=索引高度-1 clustering_factor:集群因子,通过索引扫面得出的要查询table的blocks数量,clustering_factor接近table的bl ...

  7. LeetCode 283 Move Zeroes(移动全部的零元素)

    翻译 给定一个数字数组.写一个方法将全部的"0"移动到数组尾部.同一时候保持其余非零元素的相对位置不变. 比如,给定nums = [0, 1, 0, 3, 12],在调用你的函数之 ...

  8. 百万级PHP网站Poppen.de的架构分享心得

    在了解过世界最大的PHP站点,Facebook的后台技术后, 今天我们来了解一个百万级PHP站点的网站架构:Poppen.de.Poppen.de是德国的一个社交网站,相对Facebook.Flick ...

  9. 如约而至,Java 10 正式发布! Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十四)Redis缓存正确的使用姿势 努力的孩子运气不会太差,跌宕的人生定当更加精彩 优先队列详解(转载)

    如约而至,Java 10 正式发布!   3 月 20 日,Oracle 宣布 Java 10 正式发布. 官方已提供下载:http://www.oracle.com/technetwork/java ...

  10. 常见网络摄像机默认使用的端口,RTSP地址

    品牌 默认IP地址 WEB RTSP HTTPS 数据 ONVIF   海康威视 192.168.1.64/DHCP用户名admin 密码自己设 80 554 443 8000 80   大华 192 ...