工作之余。技术?。记是不可能记住的。 只有写点东西 才能维持得了生活这样子的。好早就像写一篇关于任务调度的文章。终究是太懒了

一、Quartz.NET介绍

Quartz.NET是一个强大、开源、轻量的作业调度框架,是 OpenSymphony 的 Quartz API 的.NET移植,用C#改写,可用于winform和asp.net应用中。它灵活而不复杂。你能够用它来为执行一个作业而创建简单的或复杂的作业调度。它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等。

官网:http://www.quartz-scheduler.net/

源码:https://github.com/quartznet/quartznet

二、Quartz.NET用途

一,可以定时发邮件通知。

二 , 电商网站的定时打折活动。(比如规定11月11日 淘宝购买女朋友打八折)

三, 定时对数据更新 或者添加。

四,自己朋友生日。 可以定时发生日祝福。 等等 (我也不一一举例了)

三、Quartz.NET安装

我使用的VS版本是2015的  选择工具  - NuGet包管理 - 管理解决方案的NuGet包   输入 Quartz.NET 安装

还可以通过NuGet控制台 通过安装命令

Install-Package Quartz


四、Quartz.NET实现思路

一,继承并实现IJob接口,在Execute 方法中写你要做的事情(切记 )

二,使用Quartz 中的API 定义好 工作 触发器 以及工厂

三,加入可视化(远程管理)

四,建立配置的通讯。

五,在全局类(Global.asax)Application_Start注册并开启定时任务

五、上代码

其中JobWork 是我的定义的工作文件  里面有你要执行的工作已经对应的触发器(一个工作对应一个触发器)

首先 我写了一个向文本文件中插入文字的方法已经触发器 (注意 必须继承IJob  要做的事情写在 Execute 中)

  public class AddMassagejob : IJob
{ public void Execute(IJobExecutionContext context)
{ var reportDirectory = string.Format("~/text/{0}/", DateTime.Now.ToString("yyyy-MM-ssss"));
reportDirectory = System.Web.Hosting.HostingEnvironment.MapPath(reportDirectory);
if (!Directory.Exists(reportDirectory))
{
Directory.CreateDirectory(reportDirectory);
}
var dailyReportFullPath = string.Format("{0}text_{1}.log", reportDirectory, DateTime.Now.Day);
var logContent = string.Format("{0}-{1}-{2}", DateTime.Now, "滴 滴滴", Environment.NewLine);
if (logContent == null)
{
JobExecutionException jobex = new JobExecutionException("写入失败");
}
File.AppendAllText(dailyReportFullPath, logContent); } }
 public class AddMasagerTriggerServer
{ public ITrigger AddMasagerTrigger()
{
var trigger = TriggerBuilder.Create()
.WithIdentity("添加消息到日志", "作业触发器")
.WithSimpleSchedule(x => x
//.WithIntervalInSeconds(5)
// .WithIntervalInHours(5)
.WithIntervalInMinutes() //每五分钟执行一次
.RepeatForever())
.Build();
return trigger;
}
}

我这里设置的是5分钟执行一次。 你也可以让他5秒 5小时执行一次。

关于时间配置

官方一些常用的实例

0 0 12 * * ? 每天12点触发 
0 15 10 ? * * 每天10点15分触发 
0 15 10 * * ? 每天10点15分触发 
0 15 10 * * ? * 每天10点15分触发 
0 15 10 * * ? 2005 2005年每天10点15分触发 
0 * 14 * * ? 每天下午的 2点到2点59分每分触发 
0 0/5 14 * * ? 每天下午的 2点到2点59分(整点开始,每隔5分触发) 
0 0/5 14,18 * * ? 每天下午的 2点到2点59分(整点开始,每隔5分触发) 
每天下午的 18点到18点59分(整点开始,每隔5分触发) 
0 0-5 14 * * ? 每天下午的 2点到2点05分每分触发 
0 10,44 14 ? 3 WED     3月分每周三下午的 2点10分和2点44分触发 (特殊情况,在一个时间设置里,执行两次或                                                             两次以上的情况) 
0 59 2 ? * FRI    每周5凌晨2点59分触发; 
0 15 10 ? * MON-FRI 从周一到周五每天上午的10点15分触发 
0 15 10 15 * ? 每月15号上午10点15分触发 
0 15 10 L * ? 每月最后一天的10点15分触发 
0 15 10 ? * 6L 每月最后一周的星期五的10点15分触发 
0 15 10 ? * 6L 2002-2005 从2002年到2005年每月最后一周的星期五的10点15分触发 
0 15 10 ? * 6#3 每月的第三周的星期五开始触发 
0 0 12 1/5 * ? 每月的第一个中午开始每隔5天触发一次 
0 11 11 11 11 ? 每年的11月11号 11点11分触发(光棍节)

有兴趣的朋友可以了解 具体含义规范

然后就是创建一个作业 这里我用的是泛型去创建

 public class JobServer<T> where T : IJob
{
public string JobName { get; set; }
public string JobGroup { get; set; } public IJobDetail CrateJob()
{
IJobDetail job1 = JobBuilder.Create<T>() //创建一个作业
.WithIdentity(JobName, JobGroup) //JobName 代表你要执行的这个任务的名称。 JobGroup任务分组
.Build(); return job1;
} }

接下来就是一些 Quartz 的配置(线程配置 远程配置等) 当然 你也可以选择写在配置文件 或者XML文件中

public class JobBase
{ public static IScheduler Scheduler
{
get
{
var properties = new NameValueCollection(); // 设置线程池
properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
//设置线程池的最大线程数量
properties["quartz.threadPool.threadCount"] = "";
//设置作业中每个线程的优先级
properties["quartz.threadPool.threadPriority"] = ThreadPriority.Normal.ToString(); // 远程输出配置
properties["quartz.scheduler.exporter.type"] = "Quartz.Simpl.RemotingSchedulerExporter, Quartz";
properties["quartz.scheduler.exporter.port"] = ""; //配置端口号
properties["quartz.scheduler.exporter.bindName"] = "QuartzScheduler";
properties["quartz.scheduler.exporter.channelType"] = "tcp"; //协议类型 //创建一个工厂
var schedulerFactory = new StdSchedulerFactory(properties);
//启动
var scheduler = schedulerFactory.GetScheduler(); return scheduler;
} } public static void AddSchedule<T>(JobServer<T> jobServer,ITrigger trigger, string jobName, string jobGroup) where T : IJob
{
jobServer.JobName = jobName;
jobServer.JobGroup = jobGroup;
Scheduler.ScheduleJob(jobServer.CrateJob(), trigger);
} }
 绑定trigger和job

然后就工作层  也就是任务的声明调用处

 public class JobManager
{
public static void State()
{
//开启调度
JobBase.Scheduler.Start(); // 第一个参数是你要执行的工作(job) 第二个参数是这个工作所对应的触发器(Trigger)(例如:几秒或几分钟执行一次)
JobBase.AddSchedule(new JobServer<AddMassagejob>(),
new AddMasagerTriggerServer().AddMasagerTrigger(),"每隔五分钟向文本中写入文字","消息工作"); JobBase.AddSchedule(new JobServer<DiscountedShopJob>(),
new DiscountedShopTriggerServer().GoodsDisCountTrigger(),"每月的最后一天10.15开启打折活动","折扣活动");
}
}

在全局类中加入下面代码  开启工作

 public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes); JobManager.State();
}
}

代码部分已经完成了 接下来就是如何使用

首先 安装一个远程管理  也就是可视化操作  (你不需要写任何代码)

安装步骤一样。

在控制台 执安装命令

PM> Install-Package CrystalQuartz.Remote

安装之后你会在web.config 中发现这样的代码

其中下方红色框起来的部分   其中SchedulerHost 对应的端口号和远程名称 都要对应上方代码中配置。  一旦保持一致  意味着达成了通讯。共通了

然后启动项目在路由加上/CrystalQuartzPanel.axd

好了。 该看看效果了

由于个人英语实在有限。 命名有误 。请各位看官多多担待  谢谢大家

ASP.NET MVC5 实现基于Quartz.NET任务调度的更多相关文章

  1. ASP.NET MVC5+EF6+EasyUI 后台管理系统--任务调度系统解析

    1.任务主界面.任务可以被挂起,启动,和删除.来自著名Quartz扩展 2.任务可以是执行的SQL命令,存储过程,或者是一个后台方法 3.极其复杂的调度任务,循环次数,可以自行设置.并可以间隔执行,比 ...

  2. RDIFramework.NET框架基于Quartz.Net实现任务调度详解及效果展示

    在上一篇Quartz.Net实现作业定时调度详解,我们通过实例代码详细讲解与演示了基于Quartz.NET开发的详细方法.本篇我们主要讲述基于RDIFramework.NET框架整合Quartz.NE ...

  3. 任务调度之持久化(基于Quartz.net)

    上一篇我们了解了任务调度及他的远端管理方式,传送门:任务调度及远端管理(基于Quartz.net) 这篇我们要完成任务调度的持久化功能,即新增修改删除之类的功能,这必须得要有的,不然都不知道后台都有什 ...

  4. 任务调度之集群(基于Quartz.net)

    上一篇我们完成了任务调度的持久化,传送门:任务调度之持久化(基于Quartz.net) 这篇我们来完成Quartz.net的一个比较优秀的功能,即集群:集群可以提高任务调度服务的容灾性, 当一个节点宕 ...

  5. 项目一:第十四天 1.在realm中动态授权 2.Shiro整合ehcache 缓存realm中授权信息 3.动态展示菜单数据 4.Quartz定时任务调度框架—Spring整合javamail发送邮件 5.基于poi实现分区导出

    1 Shiro整合ehCache缓存授权信息 当需要进行权限校验时候:四种方式url拦截.注解.页面标签.代码级别,当需要验证权限会调用realm中的授权方法   Shiro框架内部整合好缓存管理器, ...

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

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

  7. C#基于Quartz.NET实现任务调度并部署Windows服务

    一.Quartz.NET介绍 Quartz.NET是一个强大.开源.轻量的作业调度框架,是 OpenSymphony 的 Quartz API 的.NET移植,用C#改写,可用于winform和asp ...

  8. 在ASP.NET Core中创建基于Quartz.NET托管服务轻松实现作业调度

    在这篇文章中,我将介绍如何使用ASP.NET Core托管服务运行Quartz.NET作业.这样的好处是我们可以在应用程序启动和停止时很方便的来控制我们的Job的运行状态.接下来我将演示如何创建一个简 ...

  9. 一行代码完成定时任务调度,基于Quartz的UI可视化操作组件 GZY.Quartz.MUI

    前言 之前发布过第一个版本,有兴趣的可以去看看: NET Core 基于Quartz的UI可视化操作组件 GZY.Quartz.MUI 简介 GitHub开源地址:l2999019/GZY.Quart ...

随机推荐

  1. 【Windows】 Windows系统小积累

    因为用Windows大多都是处理些个人事务,有很多东西搜过用过就忘了,不记住也可惜了还是记录一下 比较好 ■ win键+一个键的快捷打开方式 win键+q是搜索的快捷键,win键+r是运行的快捷键.而 ...

  2. if判断 -z -n 参数

    _echo_error() { echo -ne "\033[31;1m $1\033[0m\n";}_echo_ok() { echo -ne "\033[32;1m ...

  3. nuxt 的一些报错和插件推荐

    1.项目有启动报这个错误的,是因为node版本太低了,nuxt要求node版本要达到8.0.0以上 . 2.插件推荐

  4. heartbeat错误排查

    错误一: [root@snale2 ha.d ::]#service heartbeat start Starting High-Availability services: INFO: Resour ...

  5. 【Redis使用系列】Redis常用操作

    一.string类型的常用命令 set key value   #一个key对应一个value.多次赋值,会覆盖前面. setnx key value  #如果key存在则创建key1,并返回1,如果 ...

  6. Beta敏捷冲刺每日报告——Day4

    1.情况简述 Beta阶段Scrum Meeting 敏捷开发起止时间 2017.11.5 00:00 -- 2017.116 00:00 讨论时间地点 2017.11.5 晚9:30,电话会议会议 ...

  7. 团队作业4——第一次项目冲刺(Alpha版本)11.16

    a. 提供当天站立式会议照片一张 举行站立式会议,讨论项目安排: 整理各自的任务汇报: 全分享遇到的困难一起讨论: 讨论接下来的计划: b. 每个人的工作 (有work item 的ID) 1.前两天 ...

  8. sys模块的使用

    import sys,time ''' if sys.argv[1]=='sleepy': print('nongsi') else: print('....')''' #进度条 for i in r ...

  9. NOIP2012 提高组 Day 2

    http://www.cogs.pro/cogs/page/page.php?aid=16 期望得分:100+100+0=0 实际得分:100+20+0=120 T2线段树标记下传出错 T1 同余方程 ...

  10. 【学习笔记】windows安装jhipster踏坑记录

    序: 入职新公司第二天了,本来第一天是配置环境来着,配了一下午也没搞成那个jhipster的安装,每次以为应该正常的时候都是不对,yo是yeoman的指令,但是我是使用yarn管理的yeoman 纠结 ...