Quartz 以模块化方式构建,因此要使其运行,需要将几个组件“对齐”在一起。幸运的是,存在一些帮助实现这一点。

在 Quartz 工作之前需要配置的主要组件是:

  • 线程池
  • 工作商店
  • 数据源(如有必要)
  • 调度程序本身

自从引入基于任务的作业以来,线程池发生了很大变化。现在默认实现,DefaultThreadPool 使用 CLR 的托管线程池 将作业作为任务执行。您可以配置具有最大并发的池,这有效地限制了可以将多少并发任务调度到 CLR 的线程池。有关如何配置线程池实现的更多详细信息,请参阅配置参考。

JobStores 和 DataSources 在本教程的第 9 课中进行了讨论。值得注意的是,所有 JobStore 都实现了 IJobStore 接口 - 如果捆绑的 JobStore 之一不符合您的需求,那么您可以自己制作。

最后,您需要创建调度程序实例。调度器本身需要被命名并传递一个 JobStore 和 ThreadPool 的实例。

StdSchedulerFactory

StdSchedulerFactoryISchedulerFactory 接口的实现。它使用一组属性(NameValueCollection)来创建和初始化一个 Quartz 调度器。这些属性通常存储在文件中并从文件中加载,但也可以由您的程序创建并直接交给工厂。只需在工厂上调用 GetScheduler() 即可生成调度程序,初始化它(及其 ThreadPool、JobStore 和 DataSources),并返回其公共接口的句柄。

您可以在 Quartz 文档的“配置参考”部分找到完整的文档。

DirectSchedulerFactory

DirectSchedulerFactory 是另一个 ISchedulerFactory 实现。对于那些希望以更加程序化的方式创建调度程序实例的人来说,这很有用。通常不鼓励使用它,原因如下:

它要求用户对他们正在做的事情有更深入的了解,并且
它不允许声明性配置 - 或者换句话说,您最终对所有调度程序的设置进行硬编码。

日志记录

提示

从 Quartz.NET 3.1 开始,您可以配置 Microsoft.Extensions.Logging.Abstractions 来代替 LibLog。

LibLog

Quartz.NET 使用 LibLog 库 来满足其所有的日志记录需求。 Quartz 不会产生太多的日志信息 —— 通常只是初始化期间的一些信息,然后只有在 Jobs 执行时有关严重问题的消息。为了“调整”日志设置(例如输出量和输出去向),您需要实际配置您选择的日志框架,因为 LibLog 主要将工作委托给更成熟的日志框架,如 log4net, serilog 等

有关更多信息,请参阅 LibLog Wiki

Microsoft.Extensions.Logging.Abstractions

您可以手动或使用 Quartz.Extensions.DependencyInjection 中的服务配置 Microsoft.Extensions.Logging.Abstractions

Manual configuration

  1. // obtain your logger factory, for example from IServiceProvider
  2. ILoggerFactory loggerFactory = ...;
  3. // Quartz 3.1
  4. Quartz.LogContext.SetCurrentLogProvider(loggerFactory);
  5. // Quartz 3.2 onwards
  6. Quartz.Logging.LogContext.SetCurrentLogProvider(loggerFactory);

使用 Microsoft DI 集成进行配置。

  1. services.AddQuartz(q =>
  2. {
  3. // this automatically registers the Microsoft Logging
  4. });