.NET FX使用Quartz
运行环境:
Framework4.5.1、Quartz2.6.2.0、windows服务
创建windows服务的过程按下不表,以前多使用hangfire来做定时任务,与Sql Server搭配着来,配合的很好。现在新项目要用oracle,浪不起来了,改用Quartz.NET
1.配置环境
配置log4net的配置文件路径
1 XmlConfigurator.Configure(new FileInfo(System.AppDomain.CurrentDomain.BaseDirectory+@"\log4net.config")); 2 System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);
2.创建接口
接口主要用于服务启动时,识别job。
1 interface IBpmJob 2 { 3 void Regist(IScheduler scheduler); 4 }
3.在具体的job中,实现接口
在Regist中实现注册job的逻辑。我将job统一放到了某个文件夹下面。
1 public sealed class ExceptionFeeJob : IJob, IBpmJob 2 { 3 4 public void Execute(IJobExecutionContext context) 5 { 6 7 } 8 9 public void Regist(IScheduler scheduler) 10 { 11 try 12 { 13 var cronExceptionFeeJob = ConfigurationManager.AppSettings["Cron_ExceptionFeeJob"]; 14 var trigger = TriggerBuilder.Create() 15 .WithCronSchedule(cronExceptionFeeJob) 16 .Build(); 17 IJobDetail job = JobBuilder.Create<ExceptionFeeJob>() 18 .WithIdentity("ExceptionFeeJob") 19 .Build(); 20 scheduler.ScheduleJob(job, trigger); 21 } 22 catch (Exception ex) 23 { 24 } 25 26 } 27 }
4.注册job
在服务启动时,扫描存job所在的命名空间QuartzService.Jobs,如果这个job实现了接口则调用接口的注册函数。这样的话,只需要关注开发job就可以,服务启动时会自动注册相关的job
1 var schedulerFactory = new StdSchedulerFactory(); 2 var scheduler = schedulerFactory.GetScheduler(); 3 scheduler.Start(); 4 var assembly = Assembly.Load(typeof(MainService).Assembly.GetName().Name); 5 var assemblyTypes = assembly.GetTypes().Where(i=>i.Namespace.Equals("QuartzService.Jobs")).ToList(); 6 foreach (var item in assemblyTypes) 7 { 8 var obj = assembly.CreateInstance(item.FullName) as IBpmJob; 9 if (obj != null) { 10 obj.Regist(scheduler); 11 } 12 }

浙公网安备 33010602011771号