Quartz 配置、资源使用与 SchedulerFactory

Quartz 采用模块化架构,因此在使其运行之前,需要将多个组件“组合”在一起。幸运的是,存在一些辅助工具来帮助完成这一过程。

在 Quartz 开始工作前需要配置的主要组件包括:

  • 线程池(ThreadPool)
  • 作业存储(JobStore)
  • 数据源(DataSources,如需使用)
  • 调度器(Scheduler)本身

自从基于任务的作业引入后,线程池的使用发生了很大变化。现在,默认实现 DefaultThreadPool 使用 CLR 的托管线程池 以任务形式执行作业。您可以配置线程池的最大并发数,从而有效限制可调度到 CLR 线程池中的并发任务数量。更多关于如何配置线程池实现的细节,请参考配置参考文档。

作业存储和数据源在本教程的第 9 课中已有讨论。值得在此指出的是,所有 JobStores 都实现了 IJobStore 接口——如果捆绑的 JobStores 之一不满足您的需求,您可以自行创建。

最后,您需要创建调度器实例。调度器本身需要被赋予一个名称,并传入 JobStore 和 ThreadPool 的实例。

StdSchedulerFactory

StdSchedulerFactoryISchedulerFactory 接口的一个实现。它使用一组属性(NameValueCollection)来创建和初始化 Quartz 调度器。这些属性通常存储并从文件中加载,但也可以由您的程序直接创建并传递给工厂。简单地在工厂上调用 GetScheduler() 将会生成调度器,对其进行初始化(包括其线程池、作业存储和数据源),并返回其公共接口的句柄。

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

DirectSchedulerFactory

DirectSchedulerFactory 是另一个 ISchedulerFactory 的实现。对于那些希望以更编程化的方式创建调度器实例的人来说非常有用。然而,由于以下原因,一般不鼓励使用它:

  • 它要求用户对其操作有更深入的理解;
  • 它不允许声明性配置,换句话说,您最终会将调度器的所有设置硬编码。

日志记录

提示
自 Quartz.NET 3.1 起,您可以配置使用 Microsoft.Extensions.Logging.Abstractions 替代 LibLog。

LibLog

Quartz.NET 使用 LibLog 库来满足所有的日志记录需求。Quartz 不会产生大量的日志信息——通常只在初始化期间输出一些信息,以及在作业执行过程中输出严重问题的消息。为了“调整”日志设置(比如输出量和输出目的地),您需要实际配置您选择的日志框架,因为 LibLog 主要将工作委托给更成熟的日志框架,如 log4net、SeriLog 等。

更多详情请参阅 LibLog Wiki

Microsoft.Extensions.Logging.Abstractions

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

手动配置

// 获取日志工厂,例如从 IServiceProvider
ILoggerFactory loggerFactory = ...;

// Quartz 3.1
Quartz.LogContext.SetCurrentLogProvider(loggerFactory);

// Quartz 3.2 及以后版本
Quartz.Logging.LogContext.SetCurrentLogProvider(loggerFactory);

使用 Microsoft DI 集成配置

services.AddQuartz(q => 
{
    // 这自动注册了 Microsoft 日志记录
});
在本文档中