将Quartz.NET集成到 Castle中

Castle是针对.NET平台的一个开源项目,从数据访问框架ORM到IOC容器,再到WEB层的MVC框架、AOP,基本包括了整个开发过程中的所有东西,为我们快速的构建企业级的应用程序提供了很好的服务.具体可参看TerryLee的 Castle 开发系列文章。
     可以通过称为 Facility 的组件用控制反转 (Inversion of Control, IoC) 和依赖注入将 第三方组件插入内核中。Startable Facility当一个组件满足一定的依赖关系之后,让它自动运行,比如说启动一个窗体或者启动某种服务。 Startable Facility的使用可以说是非常地简单,只要我们的组件实现了IStartable接口就可以了,关于Startable Facility具体可参看 Castle IOC容器实践之Startable Facility(一)、 Castle IOC容器实践之Startable Facility(二)。Quartz 是一个要与 Castle集成的大项目,因为它仅需要您用 Castle的生命周期来启动和停止它。这意味着,当 Castle启动时,您想要 Quartz 启动,当 Castle关闭时,您想要 Quartz 停止。
为了保持本示例的简单性,Quartz 配置使用 Quartz 发行版附带的默认值。这些默认值位于 quartz.properties 文件中,该文件是 dll 文件的一部分。要配置 Quartz 以将数据库用于持久层、远程调度和其他高级选项,必须创建自定义的 quartz.properties 文件。
Quartz 调度器易于启动和关闭;它只通过调用 StdSchedulerFactory.DefaultScheduler 来检索调度器对象。要启动 Quartz,执行 Scheduler.Start() 方法。要停止 Quartz,执行 Scheduler.Shutdown() 方法。要使 Quartz 的生命周期跟随 Castle,将 Start() 调用放入 IStartable的 Start() 方法中,并将 Shutdown() 调用放入 IStartable的 Stop() 方法中。清单 3 展示了添加 Quartz 代码之后完整的实现。
   1:  using Castle.Core;
   2:  using Quartz.Impl;
   3:  using Quartz;
   4:  using Common.Logging;
   5:  using System.Threading;
   6:   
   7:  namespace QuartzComponent
   8:  {
   9:      [Transient]
  10:      public class QuartzStartable : IStartable
  11:      {
  12:          private ISchedulerFactory _schedFactory;
  13:   
  14:          private static ILog log = LogManager.GetLogger(typeof(QuartzStartable));
  15:   
  16:          public QuartzStartable(ISchedulerFactory schedFactory)
  17:          {
  18:              _schedFactory = schedFactory;
  19:          }
  20:   
  21:          public void Start()
  22:          {
  23:              log.Info("Starting service");
  24:              IScheduler sched = _schedFactory.GetScheduler();
  25:              
  26:               log.Info("------- Scheduling Jobs ----------------");
  27:   
  28:               // jobs can be scheduled before sched.start() has been called
  29:   
  30:               // get a "nice round" time a few seconds in the future...
  31:               DateTime ts = TriggerUtils.GetNextGivenSecondDate(null, 15);
  32:   
  33:               // job1 will only fire once at date/time "ts"
  34:               JobDetail job = new JobDetail("job1", "group1", typeof(SimpleQuartzJob));
  35:               SimpleTrigger trigger = new SimpleTrigger("trigger1", "group1");
  36:               // set its start up time
  37:               trigger.StartTime = ts;
  38:               // set the interval, how often the job should run (10 seconds here) 
  39:               trigger.RepeatInterval = 10000;
  40:               // set the number of execution of this job, set to 10 times. 
  41:               // It will run 10 time and exhaust.
  42:               trigger.RepeatCount = 100;
  43:   
  44:   
  45:               // schedule it to run!
  46:               DateTime ft = sched.ScheduleJob(job, trigger);
  47:               log.Info(string.Format("{0} will run at: {1} and repeat: {2} times, every {3} seconds",
  48:                   job.FullName, ft.ToString("r"), trigger.RepeatCount, (trigger.RepeatInterval / 1000)));
  49:               log.Info("------- Waiting five minutes... ------------");
  50:   
  51:               sched.Start();
  52:               try
  53:               {
  54:                   // wait five minutes to show jobs
  55:                   Thread.Sleep(300 * 1000);
  56:                   // executing...
  57:               }
  58:               catch (ThreadInterruptedException)
  59:               {
  60:               }
  61:             
  62:             
  63:          }
  64:   
  65:          public void Stop()
  66:          {
  67:              log.Info("Stopping service");
  68:              try
  69:              {
  70:                  IScheduler scheduler = _schedFactory.GetScheduler();
  71:                  scheduler.Shutdown(true);
  72:              }
  73:              catch (SchedulerException se)
  74:              {
  75:                  log.Error("Cannot shutdown scheduler.", se);
  76:              }
  77:   
  78:          }
  79:      }
  80:  }
    将Quartz.net集成到Castle容器中,只需要几行代码就可以了,就会在Castle容器启动的时候自动启用Quartz.net的作业调度。
   1:  namespace QuartzComponent
   2:  {
   3:      class ConsoleMain
   4:      {
   5:         static  ILog log = LogManager.GetLogger(typeof(ConsoleMain));
   6:   
   7:          [STAThread]
   8:          public static void Main(string[] args)
   9:          {
  10:              IWindsorContainer container = new WindsorContainer();
  11:              //添加Facility
  12:   
  13:              container.AddFacility("startable", new StartableFacility());
  14:   
  15:              container.AddComponent("Scheduler", typeof(ISchedulerFactory), typeof(StdSchedulerFactory));
  16:   
  17:              container.AddComponent("QuartzStartable", typeof(QuartzStartable));
  18:                         
  19:              //Console.Read();
  20:          }
  21:      }
  22:  }
结束语
对于大多数开源项目,实现少量工作就可以集成到Castle容器中,类似 Quartz.net 的应用程序是简单集成的优秀候选项,因为它只需要启动和关闭。有很多与 Quartz.net 一样简单的有助于集成的开源项目。
下载例子代码: QuartzComponent.zip
自由、创新、研究、探索……
分享至
一键收藏,随时查看,分享好友!
0人
了这篇文章
类别: Castle&IBatisNe┆阅读( 0)┆评论( 0) ┆ 返回博主首页┆ 返回博客首页
上一篇 微软推出Silverlight 1.0正式版 下一篇 详细讲解Quartz.NET

相关文章

  • Quartz.NET 0.9 发布了
  • 专访.NET平台上类RoR开源项目Castle[转载]
  • Castle ActiveRecord学习实践(1):快速入..
  • Castle 开发系列文章

职位推荐

  • Java工程师
  • Java高级工程师
  • JAVA工程师
  • JAVA工程师
  • web前端

文章评论

 
 

发表评论            

昵  称:
登录  快速注册
验证码:

点击图片可刷新验证码请点击后输入验证码博客过2级,无需填写验证码

内  容:

同时赞一个

你可能感兴趣的:(职场,休闲,Quartz.Net,Castle)