背景
很多时候,项目需要在不同时刻,执行一个或很多个不同的作业。
Windows执行计划这时并不能很好的满足需求了,迫切需要一个更为强大,方便管理,集群部署的作业调度框架。
介绍
Quartz一个开源的作业调度框架,OpenSymphony的开源项目。Quartz.Net 是Quartz的C#移植版本。
它一些很好的特性:
1:支持集群,作业分组,作业远程管理。
2:自定义精细的时间触发器,使用简单,作业和触发分离。
3:数据库支持,可以寄宿Windows服务,WebSite,winform等。
实战
Quartz框架的一些基础概念解释:
Scheduler 作业调度器。
IJob 作业接口,继承并实现Execute, 编写执行的具体作业逻辑。
JobBuilder 根据设置,生成一个详细作业信息(JobDetail)。
TriggerBuilder 根据规则,生产对应的Trigger
Nuget安装
PM> Install-Package Quartz
下面是简单使用例子,附带详细的注释:
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
31
32
33
34
35
36
37
38
39
40
41
42
43
|
static void Main( string [] args) { //从工厂中获取一个调度器实例化 IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler(); scheduler.Start(); //开启调度器 //==========例子1(简单使用)=========== IJobDetail job1 = JobBuilder.Create<HelloJob>() //创建一个作业 .WithIdentity( "作业名称" , "作业组" ) .Build(); ITrigger trigger1 = TriggerBuilder.Create() .WithIdentity( "触发器名称" , "触发器组" ) .StartNow() //现在开始 .WithSimpleSchedule(x => x //触发时间,5秒一次。 .WithIntervalInSeconds(5) .RepeatForever()) //不间断重复执行 .Build(); scheduler.ScheduleJob(job1, trigger1); //把作业,触发器加入调度器。 //==========例子2 (执行时 作业数据传递,时间表达式使用)=========== IJobDetail job2= JobBuilder.Create<DumbJob>() .WithIdentity( "myJob" , "group1" ) .UsingJobData( "jobSays" , "Hello World!" ) .Build(); ITrigger trigger2 = TriggerBuilder.Create() .WithIdentity( "mytrigger" , "group1" ) .StartNow() .WithCronSchedule( "/5 * * ? * *" ) //时间表达式,5秒一次 .Build(); scheduler.ScheduleJob(job2, trigger2); //scheduler.Shutdown(); //关闭调度器。 } |
声明要执行的作业,HelloJob:
1
2
3
4
5
6
7
8
9
10
|
/// <summary> /// 作业 /// </summary> public class HelloJob : IJob { public void Execute(IJobExecutionContext context) { Console.WriteLine( "作业执行!" ); } } |
声明要执行的作业,DumbJob:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public class DumbJob : IJob { /// <summary> /// context 可以获取当前Job的各种状态。 /// </summary> /// <param name="context"></param> public void Execute(IJobExecutionContext context) { JobDataMap dataMap = context.JobDetail.JobDataMap; string content = dataMap.GetString( "jobSays" ); Console.WriteLine( "作业执行,jobSays:" + content); } } |
其WithCronSchedule("") 拥有强大的Cron时间表达式,正常情况下WithSimpleSchedule(x) 已经满足大部分对日期设置的要求了。
Quartz.Net官方2.X教程 http://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/index.html
Quartz.Net开源地址 https://github.com/quartznet/quartznet
Net作业调度(二) -CrystalQuartz远程管理
2014-11-01 18:21 by 蘑菇先生, 6245 阅读, 24 评论, 收藏, 编辑
介绍
上篇已经了解Quartz.NET的基本使用方法了。但如果想方便的知道某个作业执行情况,需要暂停,启动等操作行为,这时候就需要个Job管理的界面。
本文介绍Quartz.NET如何进行远程job管理,如图:
实战
一:作业服务端
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
31
32
|
static void Main( string [] args) { var properties = new NameValueCollection(); properties[ "quartz.scheduler.instanceName" ] = "RemoteServerSchedulerClient" ; // 设置线程池 properties[ "quartz.threadPool.type" ] = "Quartz.Simpl.SimpleThreadPool, Quartz" ; properties[ "quartz.threadPool.threadCount" ] = "5" ; properties[ "quartz.threadPool.threadPriority" ] = "Normal" ; // 远程输出配置 properties[ "quartz.scheduler.exporter.type" ] = "Quartz.Simpl.RemotingSchedulerExporter, Quartz" ; properties[ "quartz.scheduler.exporter.port" ] = "556" ; properties[ "quartz.scheduler.exporter.bindName" ] = "QuartzScheduler" ; properties[ "quartz.scheduler.exporter.channelType" ] = "tcp" ; var schedulerFactory = new StdSchedulerFactory(properties); var scheduler = schedulerFactory.GetScheduler(); var job = JobBuilder.Create<PrintMessageJob>() .WithIdentity( "myJob" , "group1" ) .Build(); var trigger = TriggerBuilder.Create() .WithIdentity( "myJobTrigger" , "group1" ) .StartNow() .WithCronSchedule( "/10 * * ? * *" ) .Build(); scheduler.ScheduleJob(job, trigger); scheduler.Start(); } |
1
2
3
4
5
6
7
|
public class PrintMessageJob : IJob { public void Execute(IJobExecutionContext context) { Console.WriteLine( "Hello!" ); } } |
启动如下
二:作业远程管理端,无需写任何代码,引用官方程序集,嵌入到已有的web网站。
PM> Install-Package CrystalQuartz.Remote
Webconfig 需要配置的地方
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<configuration> <crystalQuartz> <provider> <add property= "Type" value= "CrystalQuartz.Core.SchedulerProviders.RemoteSchedulerProvider, CrystalQuartz.Core" /> <add property= "SchedulerHost" value= "tcp://127.0.0.1:556/QuartzScheduler" /> <!--TCP监听的地址--> </provider> </crystalQuartz> <system.webServer> <!-- Handler拦截处理了,输出作业监控页面--> <handlers> <add name= "CrystalQuartzPanel" verb= "*" path= "CrystalQuartzPanel.axd" type= "CrystalQuartz.Web.PagesHandler, CrystalQuartz.Web" /> </handlers> </system.webServer> </configuration> |
Web管理界面
其他
CrystalQuartz 提供基础功能,可以继续在此基础上进行二次开发,另外推荐使用Window服务寄宿,比较方法。
参考资源
张善友 http://www.cnblogs.com/shanyou/archive/2012/01/15/2323011.html
CrystalQuartz开源的地址 https://github.com/guryanovev/CrystalQuartz