背景
很多时候,项目需要在不同时刻,执行一个或很多个不同的作业。
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
        


 



