zoukankan      html  css  js  c++  java
  • 将Quartz.NET集成到 Castle中

    原文:https://cloud.tencent.com/developer/article/1030346

    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

  • 相关阅读:
    160628、利用Oracle rownum让表排序字段值连续
    160627、你想知道的关于JavaScript作用域的一切
    160624、Spark读取数据库(Mysql)的四种方式讲解
    160623、理解 Promise 的工作原理
    160622、详解JavaScript变量提升
    160621、Java注解教程及自定义注解
    详解JavaScript数组过滤相同元素的5种方法
    box-shadow
    Axios 中文说明
    一步一步学Vue(九) 路由元数据
  • 原文地址:https://www.cnblogs.com/yanglang/p/12072340.html
Copyright © 2011-2022 走看看