将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





本文转自 张善友 51CTO博客,原文链接:http://blog.51cto.com/shanyou/73974,如需转载请自行联系原作者
目录
相关文章
|
6月前
|
XML 开发框架 .NET
ASP.NET COR3.1 集成日志插件NLog
ASP.NET COR3.1 集成日志插件NLog
79 0
|
6月前
|
XML SQL 开发框架
|
JSON 开发框架 .NET
ASP.NET Core 集成JWT
什么是JWT?Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也...
293 0
ASP.NET Core 集成JWT
|
缓存 JSON 算法
(三).NET Core WebAPI集成JWT,实现身份验证
前两篇文章给大家介绍了在.NET Core中如何使用Swagger的文章,那今天给大家分享一下JWT 在做接口开发的同学可能都有感受,我的接口如何保护的问题,如果没有身份验证,那不是接口完全暴露在外面,任意使人调用,这显然不是我们想要的一种结果。当然做身份验证的方式有多种,今天给大家讲一种比较流行了,标准的身份验证JWT 什么是JWT?
|
3月前
|
jenkins 测试技术 持续交付
解锁.NET项目高效秘籍:从理论迷雾到实践巅峰,持续集成与自动化测试如何悄然改变游戏规则?
【8月更文挑战第28天】在软件开发领域,持续集成(CI)与自动化测试已成为提升效率和质量的关键工具。尤其在.NET项目中,二者的结合能显著提高开发速度并保证软件稳定性。本文将从理论到实践,详细介绍CI与自动化测试的重要性,并以ASP.NET Core Web API项目为例,演示如何使用Jenkins和NUnit实现自动化构建与测试。每次代码提交后,Jenkins自动触发构建流程,通过编译和运行NUnit测试确保代码质量。这种方式不仅节省了时间,还能快速发现并解决问题,推动.NET项目开发迈向更高水平。
48 8
|
2月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
53 0
|
3月前
|
开发框架 .NET 数据库连接
闲话 Asp.Net Core 数据校验(三)EF Core 集成 FluentValidation 校验数据例子
闲话 Asp.Net Core 数据校验(三)EF Core 集成 FluentValidation 校验数据例子
|
3月前
|
Java Spring UED
Spring框架的异常处理秘籍:打造不败之身的应用!
【8月更文挑战第31天】在软件开发中,异常处理对应用的稳定性和健壮性至关重要。Spring框架提供了一套完善的异常处理机制,包括使用`@ExceptionHandler`注解和配置`@ControllerAdvice`。本文将详细介绍这两种方式,并通过示例代码展示其具体应用。`@ExceptionHandler`可用于控制器类中的方法,处理特定异常;而`@ControllerAdvice`则允许定义全局异常处理器,捕获多个控制器中的异常。
48 0
|
3月前
|
开发框架 NoSQL .NET
使用 Asp.net core webapi 集成配置系统,提高程序的灵活和可维护性
使用 Asp.net core webapi 集成配置系统,提高程序的灵活和可维护性
|
6月前
|
JSON API 定位技术
.NET集成DeveloperSharp实现http网络请求&与其它工具的比较
该内容介绍了一个支持.NET Core 2.0及以上和.NET Framework 4.0及以上的HTTP请求调用方法,主要讨论了POST和GET两种形式。POST请求较为常见,涉及调用地址、发送参数、HTTP请求头和编码格式设置。文中提供了一个使用DeveloperSharp库发送POST请求的C#代码示例,用于发送短信,其中`IU.HttpPost`方法用于执行POST请求。此外,还提到了`HttpPost`方法的参数和返回值说明。最后简要提及了GET请求,通常用于URL带有查询参数的情况,并给出一个简单的GET请求示例。