Quartz.Net使用
标签:Quartz.Nethtml
在最近工做中,须要在不一样时间及不一样条件下定时发送通知及消息,最初使用 System.Timers.Timer
实现。虽然使用简单,随着须要定时处理的任务增多,考虑到 System.Timers.Timer
以下缺点:数据库
- Timer没有持久化机制;
- Timer的调度没有弹性,仅能定时触发,不可自由配置触发时间点;
- Timer不能利用线程池,每个Timer须要开启一个线程;
- 每一个Timer中的任务为串行执行,同一时间只能有一个任务在执行。前一个任务执行失败影响后面任务的执行;
而Quartz.Net
的如下优势可解决以上问题app
- 使用灵活,有多种使用方式(
eg
XML
配置任务,及代码实现),且能够混合使用;- 支持集群,做业分组,及做业远程管理;
- 可自定义精细的时间管理;
- 支持数据库,可持久化。
安装
- 经过
NuGet
安装Quartz.Net
说明
- 每个任务须要继承接口
IJob
,并实现Execute(IJobExecutionContext context)
,该方法为每一个Job
须要作的具体处理;
代码示例
- 代码建立job示例
private static void Main(string[] args) { try { WatchFile(); var fileName = Path.Combine(Environment.CurrentDirectory, "log4config.config"); XmlConfigurator.ConfigureAndWatch(new FileInfo(fileName)); StdSchedulerFactory factory = new StdSchedulerFactory(); IScheduler scheduler = factory.GetScheduler(); // 启动任务 scheduler.Start(); // 建立Job,可经过JobDataMap传递数据 IJobDetail job = JobBuilder.Create<HelloJob>() .WithIdentity("job1", "group1") .UsingJobData("jobSays", "Hello World!") .UsingJobData("myFloatValue", 3.141f) .Build(); //建立trigger ITrigger trigger = TriggerBuilder.Create() .WithIdentity("trigger1", "group1") .StartNow() .WithSimpleSchedule(x => x.WithIntervalInSeconds(10).RepeatForever()) .Build(); //把job,trigger加入调度器 scheduler.ScheduleJob(job, trigger); //关闭调度器 scheduler.Shutdown(); } catch (Exception ex) { LogHelper.Error("Main" + ex); } Console.WriteLine("Press any key to close the application"); Console.ReadKey(); } public class HelloJob : IJob { public void Execute(IJobExecutionContext context) { JobKey key = context.JobDetail.Key; //获取执行的数据 JobDataMap dataMap = context.JobDetail.JobDataMap; string jobSays = dataMap.GetString("jobSays"); float myFloatValue = dataMap.GetFloat("myFloatValue"); Console.Error.WriteLineAsync("Instance " + key + " of DumbJob says: " + jobSays + ", and val is: " + myFloatValue); } } pub
XML
方式配置Job、Trigger
代码示例 1) 在quartz_jobs.xml
为配置Job
及Trigger
的文件 配置文件示例:
<?xml version="1.0" encoding="utf-8" ?> <job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"> <processing-directives> <overwrite-existing-data>true</overwrite-existing-data> </processing-directives> <schedule> <job> <name>CommonIMRemindJob</name> <group>IMRemindJob</group> <description>IMRemindJob</description> <job-type>NXIN.Qlw.JobServices.CommonIMRemindJobService,NXIN.Qlw.JobServices</job-type> <durable>true</durable> <recover>true</recover> </job> <trigger> <simple> <name>CommonIMRemindTrigger</name> <group>IMRemindJob</group> <description>CommonIMRemindTrigger</description> <job-name>CommonIMRemindJob</job-name> <job-group>IMRemindJob</job-group> <misfire-instruction>SmartPolicy</misfire-instruction> <repeat-count>-1</repeat-count> <repeat-interval>300000</repeat-interval> </simple> </trigger> </schedule> </job-scheduling-data>
2)实现示例
private static void InitScheduler() { try { NameValueCollection props = new NameValueCollection { { "quartz.serializer", "binary" } }; XMLSchedulingDataProcessor processor = new XMLSchedulingDataProcessor(new SimpleTypeLoadHelper()); StdSchedulerFactory factory = new StdSchedulerFactory(props); IScheduler scheduler = factory.GetScheduler(); processor.ProcessFileAndScheduleJobs("~/quartz_jobs.xml", scheduler); scheduler.Start(); } catch (SchedulerException se) { LogHelper.Error("/Main/RunProgramRunExample" + se); } }
参考博客:[蘑菇先生Net做业调度系列][1] [1]: http://www.cnblogs.com/mushroom/p/4850115.htmlui