Quartz.net通过配置文件来完成作业调度
2007-12-09 18:39:00
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://shanyou.blog.51cto.com/363653/72928 |
将Quartz.NET集成到 Castle中 例子代码使用的Quartz.net版本是0.6,Quartz.NET 0.9 发布了 ,最新版本支持通过配置文件来完成后台的作业调度,不必手工创建Trigger和Scheduler。将QuartzStartable 改造如下:
using System;
using System.Collections.Generic; using System.Text; using Castle.Core;
using Quartz.Impl; using Quartz; using Common.Logging; using System.Threading; using System.IO; using Quartz.Xml; using System.Collections; namespace QuartzComponent
{ [Transient] public class QuartzStartable : IStartable { private ISchedulerFactory _schedFactory; private JobSchedulingDataProcessor processor; private static ILog log = LogManager.GetLogger(typeof(QuartzStartable));
public QuartzStartable(ISchedulerFactory schedFactory)
{ _schedFactory = schedFactory; processor = new JobSchedulingDataProcessor(true, true); } public void Start()
{ log.Info("Starting service"); IScheduler sched = _schedFactory.GetScheduler(); //log.Info("------- Scheduling Jobs ----------------");
//// jobs can be scheduled before sched.start() has been called
//// get a "nice round" time a few seconds in the future...
//DateTime ts = TriggerUtils.GetNextGivenSecondDate(null, 15); //// job1 will only fire once at date/time "ts"
//JobDetail job = new JobDetail("job1", "group1", typeof(SimpleQuartzJob)); //SimpleTrigger trigger = new SimpleTrigger("trigger1", "group1"); //// set its start up time //trigger.StartTimeUtc = ts; //// set the interval, how often the job should run (10 seconds here) //trigger.RepeatInterval = 10000; //// set the number of execution of this job, set to 10 times. //// It will run 10 time and exhaust. //trigger.RepeatCount = 100; //// schedule it to run! //DateTime ft = sched.ScheduleJob(job, trigger); //log.Info(string.Format("{0} will run at: {1} and repeat: {2} times, every {3} seconds", // job.FullName, ft.ToString("r"), trigger.RepeatCount, (trigger.RepeatInterval / 1000))); //log.Info("------- Waiting five minutes... ------------"); //sched.Start();
Stream s = ReadJobXmlFromEmbeddedResource("MinimalConfiguration.xml"); processor.ProcessStream(s, null); processor.ScheduleJobs(new Hashtable(), sched, false); sched.Start(); try { // wait five minutes to show jobs Thread.Sleep(300 * 1000); // executing... } catch (ThreadInterruptedException) { } } private static Stream ReadJobXmlFromEmbeddedResource(string resourceName)
{ string fullName = "QuartzComponent." + resourceName; return new StreamReader(typeof(QuartzStartable).Assembly.GetManifestResourceStream(fullName)).BaseStream; } public void Stop()
{ log.Info("Stopping service"); try { IScheduler scheduler = _schedFactory.GetScheduler(); scheduler.Shutdown(true); } catch (SchedulerException se) { log.Error("Cannot shutdown scheduler.", se); } }
} } 增加一个配置文件MinimalConfiguration.xml,设置为嵌入资源类型。内容如下: <?xml version="1.0" encoding="UTF-8"?>
<quartz xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" overwrite-existing-jobs="true"> <job> <job-detail> <name>jobName1</name> <group>jobGroup1</group> <job-type>QuartzComponent.SimpleQuartzJob, QuartzComponent</job-type> </job-detail> <trigger> <simple> <name>simpleName</name> <group>simpleGroup</group> <job-name>jobName1</job-name> <job-group>jobGroup1</job-group> <start-time>2007-12-09T18:08:50</start-time> <repeat-count>100</repeat-count> <repeat-interval>3000</repeat-interval> </simple> </trigger> <trigger> <cron> <name>cronName</name> <group>cronGroup</group> <job-name>jobName1</job-name> <job-group>jobGroup1</job-group> <start-time>1982-06-28T18:15:00+02:00</start-time> <cron-expression>0/10 * * * * ?</cron-expression> </cron> </trigger> </job> </quartz> 可以看到,在配置文件中把jobdetail和trigger都作了完整的定义,并组合成一个job。 当然也可以在quartz.properties文件中设置一个quertz_job.xml文件,例如:
// First we must get a reference to a scheduler
NameValueCollection properties = new NameValueCollection(); properties["quartz.scheduler.instanceName"] = "XmlConfiguredInstance"; // set thread pool info properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz"; properties["quartz.threadPool.threadCount"] = "5"; properties["quartz.threadPool.threadPriority"] = "Normal"; // job initialization plugin handles our xml reading, without it defaults are used
properties["quartz.plugin.xml.type"] = "Quartz.Plugin.Xml.JobInitializationPlugin, Quartz"; properties["quartz.plugin.xml.fileNames"] = "~/quartz_jobs.xml"; ISchedulerFactory sf = new StdSchedulerFactory(properties); 这样,在启动Castle的时候,Quartz.Plugin.Xml.JobInitializationPlugin就会自动读取quartz.properties这个配置文件,并初始化调度信息,启动Scheduler。
一个Job类,一个quartz.properties文件,一个quertz_job.xml文件,非常简单灵活。
下载例子代码 :QuartzComponentWithXml.zip
自由、创新、研究、探索…… 本文出自 “张善友” 博客,请务必保留此出处http://shanyou.blog.51cto.com/363653/72928 本文出自 51CTO.COM技术博客 |


张善友
博客统计信息
热门文章
最新评论
友情链接