将Quartz.NET集成到 Castle中

2023-11-21 15:38
文章标签 集成 net quartz castle

本文主要是介绍将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

 

这篇关于将Quartz.NET集成到 Castle中的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/403287

相关文章

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

2、PF-Net点云补全

2、PF-Net 点云补全 PF-Net论文链接:PF-Net PF-Net (Point Fractal Network for 3D Point Cloud Completion)是一种专门为三维点云补全设计的深度学习模型。点云补全实际上和图片补全是一个逻辑,都是采用GAN模型的思想来进行补全,在图片补全中,将部分像素点删除并且标记,然后卷积特征提取预测、判别器判别,来训练模型,生成的像

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

【Shiro】Shiro 的学习教程(三)之 SpringBoot 集成 Shiro

目录 1、环境准备2、引入 Shiro3、实现认证、退出3.1、使用死数据实现3.2、引入数据库,添加注册功能后端代码前端代码 3.3、MD5、Salt 的认证流程 4.、实现授权4.1、基于角色授权4.2、基于资源授权 5、引入缓存5.1、EhCache 实现缓存5.2、集成 Redis 实现 Shiro 缓存 1、环境准备 新建一个 SpringBoot 工程,引入依赖:

系统架构师-ERP+集成

ERP   集成平台end:就懒得画新的页

Spring Boot集成Tess4J实现OCR

1.什么是Tess4j? Tesseract是一个开源的光学字符识别(OCR)引擎,它可以将图像中的文字转换为计算机可读的文本。支持多种语言和书面语言,并且可以在命令行中执行。它是一个流行的开源OCR工具,可以在许多不同的操作系统上运行。Tess4J是一个基于Tesseract OCR引擎的Java接口,可以用来识别图像中的文本,说白了,就是封装了它的API,让Java可以直接调用。 Tess

使用Spring Boot集成Spring Data JPA和单例模式构建库存管理系统

引言 在企业级应用开发中,数据库操作是非常重要的一环。Spring Data JPA提供了一种简化的方式来进行数据库交互,它使得开发者无需编写复杂的JPA代码就可以完成常见的CRUD操作。此外,设计模式如单例模式可以帮助我们更好地管理和控制对象的创建过程,从而提高系统的性能和可维护性。本文将展示如何结合Spring Boot、Spring Data JPA以及单例模式来构建一个基本的库存管理系统

Spring Boot集成PDFBox实现电子签章

概述 随着无纸化办公的普及,电子文档的使用越来越广泛。电子签章作为一种有效的身份验证方式,在很多场景下替代了传统的纸质文件签名。Apache PDFBox 是一个开源的Java库,可以用来渲染、生成、填写PDF文档等操作。本文将介绍如何使用Spring Boot框架结合PDFBox来实现电子签章功能。 准备工作 环境搭建:确保你的开发环境中安装了JDK 8或更高版本,并且配置好了Maven或

springboot+maven搭建的项目,集成单元测试

springboot+maven搭建的项目,集成单元测试 1.在pom.xml文件中引入单元测试的依赖包 <!--单元测试依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></depen