Quartz 配置、资源使用与 SchedulerFactory
Quartz 采用模块化架构,因此在使其运行之前,需要将多个组件“组合”在一起。幸运的是,存在一些辅助工具来帮助完成这一过程。
在 Quartz 开始工作前需要配置的主要组件包括:
- 线程池(ThreadPool)
- 作业存储(JobStore)
- 数据源(DataSources,如需使用)
- 调度器(Scheduler)本身
自从基于任务的作业引入后,线程池的使用发生了很大变化。现在,默认实现 DefaultThreadPool
使用 CLR 的托管线程池 以任务形式执行作业。您可以配置线程池的最大并发数,从而有效限制可调度到 CLR 线程池中的并发任务数量。更多关于如何配置线程池实现的细节,请参考配置参考文档。
作业存储和数据源在本教程的第 9 课中已有讨论。值得在此指出的是,所有 JobStores 都实现了 IJobStore
接口——如果捆绑的 JobStores 之一不满足您的需求,您可以自行创建。
最后,您需要创建调度器实例。调度器本身需要被赋予一个名称,并传入 JobStore 和 ThreadPool 的实例。
StdSchedulerFactory
StdSchedulerFactory
是 ISchedulerFactory
接口的一个实现。它使用一组属性(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 日志记录
});