最近,在工作中遇到了 Quartz.net 这个组件,为了更好的理解项目代码的来龙去脉,于是决定好好的研究一下这个东西。确实是好东西,既然是好东西,我就拿出来分享一下。万丈高楼平地起,我们也从入门开始吧。

  欢迎使用 Quartz.NET 快速入门指南。 在阅读本指南时,必须注意以下条目:

  1、下载 Quartz.NET

           2、安装 Quartz.NET

           3、根据您自己的特定需求来配置 Quartz.Net

           4、展示一个示例应用程序

一、下载并安装

  您可以直接下载 ZIP 文件或使用 NuGet 包来获取文件。二者是有区别的,NuGet 包只包含运行 Quartz.NET 所必须的二进制文件,ZIP 文件就不一样了,包含源代码、示例和 Quartz.NET 服务器示例应用程序。

   Zip文件

  简短版本:如果你成功下载了 Quartz.NET 压缩包文件,只要将 ZIP 文件解压,从bin目录中获取 Quartz.dll 文件,就可以开始使用它了。

  Quartz.Net 的核心库是一个非常干净和独立的类库,不会强行依赖任何其他的二进制文件。 如果您想使用JSON.NET进行JSON序列化时,您可以根据需要选择加入更多的程序集。同时您只要保证在应用程序中包含了 Quartz.dll 文件就可以成功运行 Quartz.NET,也会和其他的二进制文件相处融洽。 因此,只要将 Quartz.dll 文件添加到使用它们的 Visual Studio 项目中就可以完美的运行。 您可以从路径bin \ your-target-framework-version \ release \ Quartz 中提取的文档中找到这些 dll。

二、NuGet包

  这是最简单的做法了,只需启动Visual Studio(安装了NuGet)并从包管理器扩展中添加对Quartz包的引用:

  1、右键单击项目的“引用”(References),然后选择“管理 NuGet 程序包(N)”(Manage NuGet Packages(N)) ...
           2、从左侧选择“浏览or在线”类别
           3、在左上方的搜索中输入 Quartz,然后按 回车 键
           4、从搜索结果中选择 Quartz.NET 并点击安装
           5、完成!

  或者使用NuGet的命令行来安装:

    Install-Package Quartz

  如果想要添加 JSON  序列化的功能,只需以相同的方式添加 Quartz.Serialization.Json 包就可以。

三、配置

  Quartz.NET 是一个支持灵活配置的库。Quartz.NET 提供三种的配置信息的方式(不相互排斥):

  1、以编程方式通过向调度程序工厂提供 NameValueCollection 参数

  2、通过使用 quartz-element 的标准 youapp.exe.config 配置文件(仅限完整的.NET框架)

  3、可以使用应用程序根目录中的  quartz.config 文件(适用于.NET Core和完整的.NET Framework)

  您可以在Quartz.NET zip文件中找到所有这些替代品的样本。

   Quartz Configuration Reference中提供了可用属性的完整文档。

  为了加速启动和运行,提供了最基本的配置信息的文件 quartz.config 看起来应该像这样:

    quartz.scheduler.instanceName = MySchedulerquartz.jobStore.type = Quartz.Simpl.RAMJobStore,Quartzquartz.threadPool.threadCount = 3

  请记住在 Visual Studio 的文件属性页上设置“复制到输出目录”以使值始终为“复制”。否则,配置文件就不会存在构建项目的目录中,就不会使用该配置文件。

  此配置创建的调度程序具有以下特征:

  quartz.scheduler.instanceName - 此调度程序的名称将为“MyScheduler”。
          quartz.threadPool.threadCount - 最多可同时运行3个作业。
          quartz.jobStore.type - 所有 Quartz 的数据,例如作业和触发器的详细信息,都保存在内存中(而不是数据库中)。即使你有一个数据库并希望在 Quartz 中使用它,我建议你在使用数据库打开一个全新的维度之前让 Quartz 使用 RamJobStore。

  实际上,如果你不想定义这些属性,Quartz.NET会提供合理的默认值

四、先看一个简单的示例程序

  现在您已经下载并安装了Quartz,现在是时候启动并运行一个示例应用程序了。 以下代码获取调度程序的实例,启动它,然后将其关闭:

using System;using System.Threading.Tasks;using Quartz;using Quartz.Impl;namespace QuartzSampleApp{public class Program{private static void Main(string[] args){// trigger async evaluationRunProgram().GetAwaiter().GetResult();}private static async Task RunProgram(){try{// 从Factory获取Scheduler实例NameValueCollection props = new NameValueCollection{{ "quartz.serializer.type", "binary" }};StdSchedulerFactory factory = new StdSchedulerFactory(props);IScheduler scheduler = await factory.GetScheduler();// 并启动它await scheduler.Start();// some sleep to show what's happeningawait Task.Delay(TimeSpan.FromSeconds(10));// 当您准备关闭程序时,最后关闭调度程序await scheduler.Shutdown();}catch (SchedulerException se){await Console.Error.WriteLineAsync(se.ToString());}}}}

从Quartz 3.0开始,当在scheduler.Shutdown() 之后没有剩下的代码要执行时,你的应用程序将终止,因为没有任何活动的线程。 如果希望在处理Task.Delay和Shutdown之后调度程序继续运行,则应手动阻止退出应用程序。

现在运行该程序将不会显示任何内容。 10秒后,程序将终止。 让我们添加一些日志记录到控制台。

五、增加日志功能

LibLog可以配置为使用不同的日志框架; 即Log4Net,NLog和Serilog。

当LibLog没有检测到任何其他日志框架存在时,它将是不做任何事的。 如果您还没有一个设置好的日志框架,我们可以配置一个自定义的日志记录器提供程序,只需登录到控制台即可显示输出。

LogProvider.SetCurrentLogProvider(new ConsoleLogProvider());private class ConsoleLogProvider : ILogProvider{public Logger GetLogger(string name){return (level, func, exception, parameters) =>{if (level >= LogLevel.Info && func != null){Console.WriteLine("[" + DateTime.Now.ToLongTimeString() + "] [" + level + "] " + func(), parameters);}return true;};}public IDisposable OpenNestedContext(string message){throw new NotImplementedException();}public IDisposable OpenMappedContext(string key, string value){throw new NotImplementedException();}}

六、探索使用 Job 作业的完整过程

现在,当我们启动应用程序时,我们应该获得更多信息。

[10:52:50] [Info] Using object serializer: Quartz.Simpl.BinaryObjectSerializer, Quartz[10:52:50] [Info] Initialized Scheduler Signaller of type: Quartz.Core.SchedulerSignalerImpl[10:52:50] [Info] Quartz Scheduler v.3.0.7.0 created.[10:52:50] [Info] RAMJobStore initialized.[10:52:50] [Info] Scheduler meta-data: Quartz Scheduler (v3.0.7.0) 'QuartzScheduler' with instanceId 'NON_CLUSTERED'Scheduler class: 'Quartz.Core.QuartzScheduler' - running locally.NOT STARTED.Currently in standby mode.Number of jobs executed: 0Using thread pool 'Quartz.Simpl.DefaultThreadPool' - with 10 threads.Using job-store 'Quartz.Simpl.RAMJobStore' - which does not support persistence. and is not clustered.[10:52:50] [Info] Quartz scheduler 'QuartzScheduler' initialized[10:52:50] [Info] Quartz scheduler version: 3.0.7.0[10:52:50] [Info] Scheduler QuartzScheduler_$_NON_CLUSTERED started.

我们需要一个简单的测试工作来测试功能,让我们创建HelloJob来向控制台输出问候语。

public sealed class HelloJob : IJob{public async Task Execute(IJobExecutionContext context){await Console.Out.WriteLineAsync("Greetings from HelloJob!");}}

要做一些有趣的事情,您需要在Task.Delay之前的Start() 方法之后使用代码。

// 定义job作业并将其绑定到HelloJob类IJobDetail job = JobBuilder.Create<HelloJob>().WithIdentity("job1", "group1").Build();//触发作业立即运行,然后每10秒重复一次ITrigger trigger = TriggerBuilder.Create().WithIdentity("trigger1", "group1").StartNow().WithSimpleSchedule(x => x.WithIntervalInSeconds(10).RepeatForever()).Build();//告诉 quartz 使用我们的触发器安排作业await scheduler.ScheduleJob(job, trigger);

完整的控制台应用程序现在看起来像这样

using System;using System.Threading.Tasks;using Quartz;using Quartz.Impl;using Quartz.Logging;namespace QuartzSampleApp{public class Program{private static void Main(string[] args){LogProvider.SetCurrentLogProvider(new ConsoleLogProvider());RunProgram().GetAwaiter().GetResult();Console.WriteLine("Press any key to close the application");Console.ReadKey();}private static async Task RunProgram(){try{// Grab the Scheduler instance from the FactoryNameValueCollection props = new NameValueCollection{{ "quartz.serializer.type", "binary" }};StdSchedulerFactory factory = new StdSchedulerFactory(props);IScheduler scheduler = await factory.GetScheduler();// and start it offawait scheduler.Start();// define the job and tie it to our HelloJob classIJobDetail job = JobBuilder.Create<HelloJob>().WithIdentity("job1", "group1").Build();// Trigger the job to run now, and then repeat every 10 secondsITrigger trigger = TriggerBuilder.Create().WithIdentity("trigger1", "group1").StartNow().WithSimpleSchedule(x => x.WithIntervalInSeconds(10).RepeatForever()).Build();// Tell quartz to schedule the job using our triggerawait scheduler.ScheduleJob(job, trigger);// some sleep to show what's happeningawait Task.Delay(TimeSpan.FromSeconds(60));// and last shut down the scheduler when you are ready to close your programawait scheduler.Shutdown();}catch (SchedulerException se){Console.WriteLine(se);}}// simple log provider to get something to the consoleprivate class ConsoleLogProvider : ILogProvider{public Logger GetLogger(string name){return (level, func, exception, parameters) =>{if (level >= LogLevel.Info && func != null){Console.WriteLine("[" + DateTime.Now.ToLongTimeString() + "] [" + level + "] " + func(), parameters);}return true;};}public IDisposable OpenNestedContext(string message){throw new NotImplementedException();}public IDisposable OpenMappedContext(string key, string value){throw new NotImplementedException();}}}public class HelloJob : IJob{public async Task Execute(IJobExecutionContext context){await Console.Out.WriteLineAsync("Greetings from HelloJob!");}}}

现在去探索Quartz.NET吧! 您可以继续阅读本教程。原文地址如下:https://www.quartz-scheduler.net/documentation/quartz-3.x/quick-start.html

【转】Quartz.NET快速入门指南相关推荐

  1. Quartz.NET快速入门指南

    最近,在工作中遇到了 Quartz.net 这个组件,为了更好的理解项目代码的来龙去脉,于是决定好好的研究一下这个东西.确实是好东西,既然是好东西,我就拿出来分享一下.万丈高楼平地起,我们也从入门开始 ...

  2. BERT模型超酷炫,上手又太难?请查收这份BERT快速入门指南!

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 来自 | GitHub    作者 | Jay Alammar 转自 | 机器之心 如 ...

  3. BERT模型超酷炫,上手又太难?请查收这份BERT快速入门指南

    2019-12-31 10:50:59 选自GitHub 作者:Jay Alammar 参与:王子嘉.Geek AI 如果你是一名自然语言处理从业者,那你一定听说过最近大火的 BERT 模型.本文是一 ...

  4. Quartz 框架快速入门(二)

    尽可能的用声明式处理软件配置,其次才考虑编程式的方式.在上一篇<Quartz 框架快速入门(一)>中,如果我们要在 Job 启动之后改变它的执行时间和频度,必须去修改源代码重新编译.这种方 ...

  5. RMAN快速入门指南

    RMAN快速入门指南   1. What is RMAN? 什么是RMAN?    4 2. Terminology 专业词汇解释    4 2.1. Backup sets 备份集合    4 2. ...

  6. 150页书籍《PyTorch 深度学习快速入门指南》附PDF电子版

    为什么说是极简教程,首先本书只涵盖了150页.内容比较精简,特别适合作为 PyTorch 深度学习的入门书籍.为什么这么说呢?因为很多时候,一份厚重的书籍往往会削弱我们学习的积极性,在学习一门新的语言 ...

  7. h5py快速入门指南

    h5py是Python语言用来操作HDF5的模块.下面的文章主要介绍h5py的快速入门指南,翻译自h5py的官方文档:http://docs.h5py.org/en/lates... .该翻译仅为个人 ...

  8. 2017 Vue.js 2快速入门指南

    注意,据部分读者反映本文水多,怕湿身者勿进.后续推荐详解 Vue & Vuex 实践 2017 Vue.js 2快速入门指南翻译自Vue.js 2 Quickstart Tutorial 20 ...

  9. Quartz 框架快速入门(四)

    Spring的scheduling.quartz包中对Quartz框架进行了封装,使得开发时不用写任何QuartSpring的代码就可以实现定时任务.Spring通过JobDetailBean,Met ...

  10. Quartz 框架快速入门(三)

    在前面两篇文章中简单介绍了在java应用程序中如何使用Quartz框架,这一篇中我们将看到如何在web环境下通过配置文件来完成Quartz的后台作业调度,而不必手工去创建Trigger和Schedul ...

最新文章

  1. 智源学者韩银和、蔡一茂入选2020年度国家杰出青年科学基金建议资助项目申请人名单...
  2. CSS3新的鼠标样式介绍
  3. MTP 多媒体传输协议
  4. 2018年第九届省赛C/C++A组第2题——星期一
  5. 牛客 - 丁姐姐喜欢Fibonacci(找规律+思维)
  6. 当我们谈高性能时,我们谈些什么?(送书活动)
  7. KVM虚拟机IO处理过程(二) ----QEMU/KVM I/O 处理过程
  8. Using Sqoop 1.4.6 With Hadoop 2.7.4
  9. model数据库orm操作
  10. c语言 callback回调函数
  11. 4月12日云栖精选夜读:阿里云黄海宇:窄带高清2.0——让直播更惊艳的魔术
  12. python进行数据可视化时,中文是方块显示
  13. 文件存储-CephFS
  14. 2021window10下的IDEA安装
  15. Swift中MVP、Moya、模型设计
  16. 网络学习提要,真是太全了
  17. Ubuntu 16.04使用阿里云邮箱命令行发送邮件配置(完整亲测版)
  18. qq登陆inc.php,JTBC(php) 版 QQ 一键登录实现过程
  19. 3-AltiumDesignerPCB设计
  20. android从应用到驱动之—camera(2)---cameraHAL的实现

热门文章

  1. 【图像分割】基于matlab GUI阙值+边缘检测+区域法图像分割【含Matlab源码 817期】
  2. 【电力负荷预测】基于matlab SVM短期电力负荷预测【含Matlab源码 280期】
  3. 【优化预测】基于matlab差分算法优化ANN预测【含Matlab源码 151期】
  4. 【卡号识别】基于matlab CNN银行卡数字识别【含Matlab源码 030期】
  5. php 生成vbs文件路径,vbs下一些取特殊路径的方法总结
  6. 数据集:102 flower、Cratech256、ImageNet数据集下载
  7. vector容器,容量和大小的操作
  8. Ubuntu18.04安装MyEclipse2017 CI 10
  9. Spring MVC笔记 使用JdbcTemplate
  10. image转base64