本文档概述了每个版本升级所需的更改。 您需要检查要跳过的每个版本的步骤。 您还应该检查完整的更改日志

提示

如果您是从最新版本开始的新用户,则无需遵循本指南。 直接跳到教程

Quartz 跳到 async/await 世界,并在 3.0 版本中增加了对 .NET Core 的支持,因此可以在 API 和可用功能上找到最重要的更改,具体取决于您是针对完整的 .NET Framework 还是 .NET Core。

包装变化

Quartz NuGet 包被拆分为更具体的包。

  • Quartz.Jobs 现在是您可能需要的单独 NuGet 依赖项
    • 目录扫描作业
    • 文件扫描作业
    • 本地工作
    • 发送邮件作业
  • Quartz.Plugins 现在是您可能需要的单独 NuGet 依赖项
    • XMLSchedulingDataProcessorPlugin

检查您是否引用了所需的 NuGet 包,并且您的配置还引用了正确的程序集。

数据库架构更改

2.6 模式应与 3.0 一起使用,无需更改。

迁移 HolidayCalendar 二进制格式

如果您将 HolidayCalendars以二进制格式存储在数据库中(仅使用 AdoJobStore 存储)。您需要先用 Quartz 2.4 或更高的 2.x 版本加载它们,然后重新存储它们。这将使序列化使用不依赖于 C5 库存在的格式。

线程池变化

  • SimpleThreadPool被完全删除,它现在是 DefaultThreadPool的同义词
  • 作业现在在 CLR 线程池中运行
  • ThreadCount参数仍然限制了 CLR 线程池中最多排队的项目数
  • 不再支持线程优先级,需要去掉 threadPriority 参数

API 更改

调度程序和作业 API 方法现在基于任务。这反映了您如何定义作业和使用调度程序进行操作。

Scheduler

现在,您需要确保在使用调度程序时有适当的等待:

  1. // operating with scheduler is now Task-based and requires appropriate awaits
  2. await scheduler.ScheduleJob(job, trigger);
  3. await scheduler.Start();
  4. await scheduler.Shutdown(waitForJobsToComplete: true);

Job

Job 的 Execute 方法现在返回一个 Task 并且可以轻松包含异步代码:

  1. // Jobs now return tasks from their Execute methods
  2. public class MyJob : IJob
  3. {
  4. public async Task Execute(IJobExecutionContext context)
  5. {
  6. // dummy 1ms sleep
  7. await Task.Delay(1);
  8. }
  9. }

如果你的工作没有任何异步,你可以在 Execute 方法的末尾返回 Task.CompletedTask(从 .NET 4.6 开始可用)。

IInterruptableJob

IInterruptableJob接口已被移除。您需要检查 IJobExecutionContext'sCancellationToken.IsCancellationRequested 以确定是否已请求作业中断。

IStatefulJob

在 2.x 中废弃的 IStatefulJob接口已被删除,您应该使用 DisallowConcurrentExecutionPersistJobDataAfterExecution属性来实现您的目标。

其他 API

如果您创建了 Quartz 使用的服务的自定义实现,您将需要调整您的代码以使其基于异步。

作业存储序列化配置更改

现在,如果您在配置调度程序时使用持久作业存储 (AdoJobStore),则需要明确说明是要使用二进制还是 json 序列化。

  • 对于现有设置,您应该使用旧的二进制序列化来确保事情像以前一样工作(请参阅 Quartz.Serialization.Json 文档了解迁移路径)
  • 对于新项目,建议使用 JSON 序列化,因为它不处理二进制版本控制问题,它应该更快更健壮
  • JSON 更安全,通常是向前使用的方式

如果您选择使用 JSON 序列化,请记住将 NuGet 包引用 Quartz.Serialization.Json 添加到您的项目中。

配置二进制序列化策略:

  1. var properties = new NameValueCollection
  2. {
  3. ["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz",
  4. // "binary" is alias for "Quartz.Simpl.BinaryObjectSerializer, Quartz"
  5. ["quartz.serializer.type"] = "binary"
  6. };
  7. ISchedulerFactory sf = new StdSchedulerFactory(properties);

配置 JSON 序列化策略(推荐):

  1. var properties = new NameValueCollection
  2. {
  3. ["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz",
  4. // "json" is alias for "Quartz.Simpl.JsonObjectSerializer, Quartz.Serialization.Json"
  5. ["quartz.serializer.type"] = "json"
  6. };
  7. ISchedulerFactory sf = new StdSchedulerFactory(properties);

简化的 job store provider 名称

ADO.NET 提供程序名称已简化,提供程序名称没有版本,例如 SqlServer-20 => SqlServer。 它们现在绑定到可以加载的任何版本。

C5 集合

C5 集合不再 ILMerged 在 Quartz 中,.NET 4.5 提供了所需的集合。

日志记录

Common.Logging 已替换为 LibLog ,以减少依赖项。 如果支持,LibLog 应该会自动检测您选择的日志记录框架。

远程处理

目前仅在完整框架版本上运行时才支持远程处理。