Net作业调度-----Quartz.Net
一:业务需求:
项目需要在不同时刻,执行一个或很多个不同的作业。
Windows执行计划这时并不能很好的满足需求了,迫切需要一个更为强大,方便管理,集群部署的作业调度框架。
二:介绍
Quartz一个开源的作业调度框架,OpenSymphony的开源项目。Quartz.Net 是Quartz的C#移植版本。
特性:
1:支持集群,作业分组,作业远程管理。
2:自定义精细的时间触发器,使用简单,作业和触发分离。
3:数据库支持,可以寄宿Windows服务,WebSite,winform等。
三:使用的方法:
1.名词的解释:
Scheduler 作业调度器。
IJob 作业接口,继承并实现Execute, 编写执行的具体作业逻辑。
JobBuilder 根据设置,生成一个详细作业信息(JobDetail)。
TriggerBuilder 根据规则,生产对应的Trigger
2.学习的官网
Quartz.Net官方2.X教程 Install-Package Quartz
4.代码解释:
using System;using System.Collections.Generic;using System.Linq;using System.Web;using Quartz;using Quartz.Impl;using System.Collections.Specialized;namespace Portal.JobScheduler{ public class QuartzManager where T:class,IJob { //调度程序的工厂的接口中 实例一个具体的调度方法 private static ISchedulerFactory schedulerFactory = new StdSchedulerFactory(); //JOb群组名 private static string JOB_GROUP_NAME = "JOBGROUP_NAME"; //触发器群 private static string TRIGGER_GROUP_NAME = "TRIGGERGROUP_NAME"; /// /// 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名 /// /// 任务名 /// 触发器表达式 public static void AddJob(string pStrJobName, string pStrCronExpress) { try { //接口中获取调度工厂的 GetScheduler() 方法 IScheduler sched = schedulerFactory.GetScheduler(); //创建任务 IJobDetail job = JobBuilder.Create().WithIdentity(pStrJobName, JOB_GROUP_NAME).Build(); //创建触发器 ITrigger trigger = TriggerBuilder.Create() .WithIdentity(pStrJobName, TRIGGER_GROUP_NAME) .WithCronSchedule(pStrCronExpress) .Build(); sched.ScheduleJob(job, trigger); sched.Start(); } catch (Exception e) { throw new Exception(e.Message); } } /// /// 移除一个任务(使用默认的任务组名,触发器名,触发器组名) /// /// public static void RemoveJob(string pStrJobName) { try { IScheduler sched = schedulerFactory.GetScheduler(); JobKey jobkey = new JobKey(pStrJobName); TriggerKey triggerKey = new TriggerKey(pStrJobName, TRIGGER_GROUP_NAME); //停止触发器 sched.PauseTrigger(triggerKey); //移除触发器 sched.UnscheduleJob(triggerKey); //删除任务 sched.DeleteJob(jobkey); } catch (Exception e) { throw new Exception(e.Message); } } /// /// 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名) /// /// 任务名 /// 触发器表达式 public static void ModifyJobTime(string pStrJobName, string pStrCronExpress, IDictionary pDictionary) { try { IScheduler sched = schedulerFactory.GetScheduler(); TriggerKey triggerKey = new TriggerKey(pStrJobName, TRIGGER_GROUP_NAME); ICronTrigger trigger = (ICronTrigger)sched.GetTrigger(triggerKey); if (trigger == null) { return; } RemoveJob(pStrJobName); AddJob(pStrJobName, pStrCronExpress); } catch (Exception e) { throw new Exception(e.Message); } } /// /// 开启所有定时任务 /// public static void startJobs() { try { IScheduler sched = schedulerFactory.GetScheduler(); sched.Start(); } catch (Exception e) { throw new Exception(e.Message); } } /// /// 关闭所有的定时任务 /// public static void shutdownJobs() { try { IScheduler sched = schedulerFactory.GetScheduler(); if (!sched.IsShutdown) { sched.Shutdown(); } } catch (Exception e) { throw new Exception(e.Message); } } /// /// 恢复所有的任务 /// public static void ResumeAllJobs() { try { IScheduler sched = schedulerFactory.GetScheduler(); if (!sched.IsShutdown) { sched.ResumeAll(); } } catch (Exception e) { throw new Exception(e.Message); } } /// /// 暂停所有的作业 /// public static void PauseAllJobs() { try { IScheduler sched = schedulerFactory.GetScheduler(); sched.PauseAll(); } catch (Exception e) { throw new Exception(e.Message); } } }}
Asp。net调用:
在global文件中进行配置
private void RegisterJob() { QuartzManager.AddJob("SHiddenDangerCautionInfo", "0 0 08 ? * *"); }
调度类的写法:
public class SyncWeatherInfoJob:IJob { public void Execute(IJobExecutionContext context) { UpdateWeatherForecast(); } /// /// 更新气象实况信息 /// public void UpdateWeatherForecast() { WeatherForecast.InsertWeatherInfo(); --这里的代码就不贴出来 } }
这样就完成了调度任务
CrystalQuartz 远程管理
CrystalQuartz开源的地址 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() .WithIdentity("myJob", "group1") .Build(); var trigger = TriggerBuilder.Create() .WithIdentity("myJobTrigger", "group1") .StartNow() .WithCronSchedule("/10 * * ? * *") .Build(); scheduler.ScheduleJob(job, trigger); scheduler.Start(); }public class PrintMessageJob : IJob { public void Execute(IJobExecutionContext context) { Console.WriteLine("Hello!"); } }
二:作业远程管理端,无需写任何代码,引用官方程序集,嵌入到已有的web网站。
PM> Install-Package CrystalQuartz.Remote
Webconfig 需要配置的地方
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
暂时没有评论,来抢沙发吧~