Quartz.NET——作业调度组件
关于Quartz.NET,请访问它的网站:http://quartznet.sourceforge.net 下载Quartz.NET,请直接进这里:http://quartznet.sourceforge.net/download.html 首先看下在什么情况下我们会需要使用Quartz.NET来进行作业调度。在业务系统中,我们需要在每天的某一个时间点(例如晚上12点)中做一些统计报表的生成(例如生成当前的一些报表之类~);或者在网站中定时更新静态页面;或者在CRM中会在某些特殊的日子给予提醒。总之这些在根据预定好的时间规则里要去做某些事情的需求,都是可以用这个来解决的,当然了,前提是你开发的东西用的是.NET- -!
配置
使用Quartz.NET,我们需要在配置文件里面添加点东西,首先是configSections节点中,我们要添加已下内容:
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 > |
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 > |
注:以上的配置我还没有去仔细研究,我是在网上找中文资料抄的 - -!
下面用代码来说明问题,我们用代码来完成这样一个需求:在web项目中有一个txt文件(文件名为JobNotePad.txt),每隔十秒钟就把当前时间记录在里面。这里我们使用CronTrigger这种触发器来完成任务。首先我们要实现IJob接口,定义一个类如下:
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中加入如下代码:
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中用到它,如下(关闭作业调度):
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代码如下:
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——作业调度组件的更多相关文章
- Quartz.NET作业调度框架详解(转)
Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性而不牺牲 ...
- .net Quartz 服务 作业调度
.net项目中使用Quartz (1)在web.config中进行相关配置 <configSections> <section name="quartz" t ...
- .NET Core开源Quartz.Net作业调度框架实战演练
一.需求背景 人生苦短,我用.NET Core!作为一枚后端.NET开发人员,项目实践常遇到定时Job任务的工作,在Windows平台最容易想到的的思路Windows Service服务应用程序,而在 ...
- 用Quartz进行作业调度(转)
概述 各种企业应用几乎都会碰到任务调度的需求,就拿论坛来说:每隔半个小时生成精华文章的RSS文件,每天凌晨统计论坛用户的积分排名,每隔30分钟执行锁定用户解锁任务. 对于一个典型的MIS系统来说,在每 ...
- Quartz.NET作业调度框架详解
Quartz.NET作业调度框架详解 http://www.cnblogs.com/lmule/archive/2010/08/28/1811042.html
- Java使用quartz实现作业调度
在spring boot中使用quartz实现作业调度的功能,简单易用. 什么是Quartz? Quartz是Java领域最著名的.功能丰富的.开放源码的作业调度工具,几乎可以在所有的Java应用程序 ...
- quartz开源作业调度框架的配置
quartz开源作业调度框架的job服务实现,Quartz是一个完全由java编写的开源作业调度框架,使用时候需要创建一个实现org.quartz.Job接口的java类,Job接口包含唯一的方法: ...
- 一个基于swoole的作业调度组件,已经实现了redis和rabitmq队列消息存储。
https://github.com/kcloze/swoole-jobs 一个基于swoole的作业调度组件,已经实现了redis和rabitmq队列消息存储.参考资料:swoole https:/ ...
- .net core quartz job作业调度管理组件
定时作业对于多数系统来说,都会用到,定时作业的实现方式可以有多种方式,简单的方式用Timer就可以实现,但是达不到通用的效果,本文采用Quartz基础组件来搭建一套企业通用的作业调度管理服务,希望对于 ...
随机推荐
- 【BZOJ 3747】 3747: [POI2015]Kinoman (线段树)
3747: [POI2015]Kinoman Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 830 Solved: 338 Description ...
- [P3759][TJOI2017]不勤劳的图书管理员(分块+树状数组)
题目描述 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆产生 这两本书页数的和的厌烦度.现在有n本被打乱顺序的书 ...
- Codeforces 839D Winter is here(容斥原理)
[题目链接] http://codeforces.com/contest/839/problem/D [题目大意] 给出一些数,求取出一些数,当他们的GCD大于0时,将数量乘GCD累加到答案上, 求累 ...
- 【最小路径覆盖】BZOJ2150-部落战争
[题目大意] 给出一张图,'*'表示不能走的障碍.已知每只军队可以按照r*c的方向行军,且军队与军队之间路径不能交叉.问占据全部'.'最少要多少支军队? [思路] 首先注意题意中有说“军队只能往下走” ...
- bzoj 1833
f[pos][top] 统计数字个数 g[pos][top][digit] 统计数位(对于f[pos][top]中的所有数) /************************************ ...
- bzoj 1598: [Usaco2008 Mar]牛跑步 -- 第k短路,A*
1598: [Usaco2008 Mar]牛跑步 Time Limit: 10 Sec Memory Limit: 162 MB Description BESSIE准备用从牛棚跑到池塘的方法来锻炼 ...
- [转]Android适配器之ArrayAdapter、SimpleAdapter和BaseAdapter的简单用法与有用代码片段
收藏ArrayAdapter.SimpleAdapter和BaseAdapter的一些简短代码片段,希望用时方便想起其用法. 1.ArrayAdapter 只可以简单的显示一行文本 代码片段: A ...
- YII 关联查询
通过外键自己关联自己
- timeago.js-时间显示插件
注意事项: 1. 时间格式 = “2018-03-02 17:13:00”时,动态获取的时间无法通过 拼接字符串的方法 添加到 dom元素的 datetime属性上,结果为 <div class ...
- 使用ScrapySharp快速从网页中采集数据
ScrapySharp是一个帮助我们快速实现网页数据采集的库,它主要提供了如下两个功能 从Url获取Html数据 提供CSS选择器的方式解析Html节点 安装: ScrapySharp可以直接从Nug ...