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

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

namespace QuartzNetMvcDemo
{
  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(触发器),示例代码如下:

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

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

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

时间: 2024-08-27 15:08:37

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

基于ASP.NET MVC和Bootstrap搭建响应式个人博客站

1.0 为什么要做这个博客站? www.zynblog.com 在工作学习中,经常要搜索查找各种各样的资料,每次找到相关资料后都会顺手添加到浏览器书签中,时间一长,书签也就满了.而且下次再点击这个书签时,可能 就会忘记当时为什么要添加这个书签了,更有可能书签连接已经无效.这样一来,也就不方便自己查阅了.如果转载.收藏到自己的博客园账号中.CSDN账号 中,脚本之家中,知乎中等等,依然是很凌乱,不方便下次查阅. 因此,我下决心开发一个个人技术博客站.主要原因是:可以整合各种宝贵资源,将知识变为宝库

Orchard 基于 ASP.NET MVC 技术的免费开源内容管理系统

Orchard 是由微软公司创建,基于 ASP.NET MVC 技术的免费开源内容管理系统: 可用于建设博客.新闻门户.企业门户.行业网站门户等各种网站 简单易用的后台界面 性能稳定,功能齐全 热拔插模块化架构提供超强可扩展性 BSD 协议授权,可用于商业闭源项目 下载地址:https://orchard.codeplex.com/releases/view/119931 相关博客:http://www.orchardch.com/Blog 一个基于Orchard的开源CRM --coevery

基于ASP.NET MVC和Bootstrap搭建响应式个人博客站(一)

1.0 为什么要做这个博客站? www.zynblog.com   在工作学习中,经常要搜索查找各种各样的资料,每次找到相关资料后都会顺手添加到浏览器书签中,时间一长,书签也就满了.而且下次再点击这个书签时,可能 就会忘记当时为什么要添加这个书签了,更有可能书签连接已经无效.这样一来,也就不方便自己查阅了.如果转载.收藏到自己的博客园账号中.CSDN账号 中,脚本之家中,知乎中等等,依然是很凌乱,不方便下次查阅. 因此,我下决心开发一个个人技术博客站.主要原因是:可以整合各种宝贵资源,将知识变为

基于ASP.NET MVC的快速开发平台,给你的开发一个加速度!

基于ASP.NET MVC的快速开发平台,给你的开发一个加速度! bingo炸了 2017/4/6 11:07:21 阅读(37) 评论(0) 现在的人做事情都讲究效率,最好能达到事半功倍那种效果,软件行业也不例外.但是需求的一再变动,架构和业务功能的一改再改,往往使得软件的开发事倍功半.软件行业急需突破现现状,所以快速开发框架就这么应运而生了.但是市面上快速开发框架种类繁多,今天我给大家带来的是一套界面风格简洁大方.多业务功能.基于ASP.NET+MVC的快速开发框架. 体验地址我会在下文附上

如何提高码农产量,基于ASP.NET MVC的敏捷开发框架开发随笔一

公司业务量比较大,接了很多项目,为了缩短开发周期老板让我牵头搭建了一个敏捷开发框架. 我们主要的业务是做OA.CRM.ERP一类的管理系统,一个通用的后台搭出来,再配合一些快速开发的组件开发效率能提高很多. 另外老板一再强调要支持APP开发,一次开发能部署到安卓和IOS上. 作为开篇之作,先介绍一下该框架的功能点及技术点,后续的文章再按功能详细讲解. 献上<在线体验Demo地址>希望大家也能从中得到一些启发. 体验地址:http://www.learun.cn:8090 . 用户名:Syste

GPS部标平台的架构设计(十)-基于Asp.NET MVC构建GPS部标平台

在当前很多的GPS平台当中,有很多是基于asp.NET+siverlight开发的遗留项目,代码混乱而又难以维护,各种耦合和关联,要命的是界面也没见到比Javascript做的控件有多好看,随着需求的增多,平台已经臃肿不堪. 设计基于.NET的GPS部标平台,我们坚定不移的选择了基于JQUERY+Asp.NET MVC来作为前端交互和后台处理的框架.选用一个灵活的脚手架,同时团队又能掌握这个脚手架为团队所用. 对于一个web应用项目,基于MVC的框架,前面文章提到过,最大的优点就是结构清晰,强制

分享技术:基于ASP.NET MVC+漂亮UIBootstrap的敏捷开发框架开发随笔一

公司业务量比较大,接了很多项目,为了缩短开发周期老板让我牵头搭建了一个敏捷开发框架. 我们主要的业务是做OA.CRM.ERP一类的管理系统,一个通用的后台搭出来,再配合一些快速开发的组件开发效率能提高很多. 另外老板一再强调要支持APP开发,一次开发能部署到安卓和IOS上. 作为开篇之作,先介绍一下该框架的功能点及技术点,后续的文章再按功能详细讲解. 献上<在线体验Demo地址>希望大家也能从中得到一些启发. 体验地址:http://www.learun.cn/adms/index.html 

零度基于 ASP.NET MVC + EF 构建的微框架开源

零度微框架,基于 MVC 与 EF 的轻量级快速开发框架,现在就使用零度微框架提高生产效率. 简单灵活的认证授权系统 无需编码即可管理系统用户 多角色授权更简单 几分钟使用模板生成具有多功能的界面和代码 无限级导航菜单配置 系统错误日志快速筛选 提供12种主题灵活选择 零度微框架架构图 贴心的功能支持扩展开发 用户管理.角色管理.灵活授权.实体权限.导出报表.微信集成.定时任务.代码生成.性能探测.数据迁移.通用分页.模型映射.链式验证.依赖注入.缓存管理.异常处理.日志跟踪.多语言支持.可定制

基于asp.net MVC 的服务器和客户端的交互(二)之获取Oauth 2.0认证权限

基本Web API的ASP.NET的Oauth2认证 增加Token额外字段 增加Scope授权字段 持久化Token 设计Token的时间间隔 刷新Token后失效老的Token 自定义验证[重启IIS池Token失效,验证权限] Oauth2 认证的流程 客户端发送口令(grant_type,client_id,client_secret)到服务端请求,认证返回access token ,然后客户端跟据获得的access token,根据Access Token获得权限去访问Web API.