小记一下通过Quartz 进行轮询数据库从而进行自动打印的需求。
一:首先通过NuGet引用Quartz,Quartz依赖Common.Logging和Common.Logging.Log4Net1211,所以同时需要引用这两个DLL,Common.Logging.Log4Net1211最新版本名称是Common.Logging.Log4Net1213,引用即可。
二:创建Job,基础代码如下
1 /// <summary> 2 /// 自动打印job 3 /// </summary> 4 [DisallowConcurrentExecution] 5 public class AutoPrintJob : IJob 6 { 7 public async Task Execute(IJobExecutionContext context) 8 { 9 await Task.Run(() => 10 { 11 //具体处理逻辑 12 }); 13 } 14 }
三:创建Scheduler,基础代码如下
1 public class PrintJobScheduler 2 { 3 public static IScheduler scheduler; 4 public static void Start() 5 { 6 try 7 { 8 Logger.Log($"开始创建自动打印任务", Logger.Category.General, Logger.Severity.Information); 9 //创建调度单元 10 Task<IScheduler> tsk = StdSchedulerFactory.GetDefaultScheduler(); 11 //不能注释,注释掉添加调度池的时候会报错 12 scheduler = tsk.Result; 13 //2.创建一个具体的作业即job (具体的job需要单独在一个文件中执行) 14 IJobDetail job = JobBuilder.Create<AutoPrintJob>().WithIdentity("AutoPrintIdentity").Build(); 15 string isDebug = ConfigurationManager.AppSettings["IsDebug"].ToString(); 16 string cronExpression = GetLoopInterval(); 17 //3.创建并配置一个触发器即trigger 18 ITrigger _CronTrigger = TriggerBuilder.Create() 19 .WithIdentity("TriggerAutoPrint") 20 .WithCronSchedule(cronExpression) //秒 分 时 某一天 月 周 年(可选参数) 21 .Build() 22 as ITrigger; 23 //4.将job和trigger加入到作业调度池中 24 scheduler.ScheduleJob(job, _CronTrigger); 25 //5.开启调度 26 scheduler.Start(); 27 Logger.Log($"创建自动打印任务成功", Logger.Category.General, Logger.Severity.Information); 28 } 29 catch (Exception ex) 30 { 31 Logger.Log($"创建自动打印任务失败,错误信息:"+ex, Logger.Category.ErrorLog, Logger.Severity.Error); 32 } 33 } 34 public static string GetLoopInterval() 35 { 36 //获取配置文件任务循环间隔 37 int intervalConfig = 1; 38 if (ConfigurationManager.AppSettings["AutoPrintIntervalTime"]!=null) 39 { 40 intervalConfig = Convert.ToInt32(ConfigurationManager.AppSettings["AutoPrintIntervalTime"]); 41 } 42 return intervalConfig.ToString(); 43 } 44 }
四:在Global.axax调用Scheduler: