本文档概述了每个版本升级所需的更改。 您需要检查要跳过的每个版本的步骤。 您还应该检查完整的更改日志。
提示
如果您是从最新版本开始的新用户,则无需遵循本指南。 直接跳到教程
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
现在,您需要确保在使用调度程序时有适当的等待:
// operating with scheduler is now Task-based and requires appropriate awaits
await scheduler.ScheduleJob(job, trigger);
await scheduler.Start();
await scheduler.Shutdown(waitForJobsToComplete: true);
Job
Job 的 Execute 方法现在返回一个 Task 并且可以轻松包含异步代码:
// Jobs now return tasks from their Execute methods
public class MyJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{
// dummy 1ms sleep
await Task.Delay(1);
}
}
如果你的工作没有任何异步,你可以在 Execute 方法的末尾返回 Task.CompletedTask(从 .NET 4.6 开始可用)。
IInterruptableJob
IInterruptableJob
接口已被移除。您需要检查 IJobExecutionContext'sCancellationToken.IsCancellationRequested
以确定是否已请求作业中断。
IStatefulJob
在 2.x 中废弃的 IStatefulJob
接口已被删除,您应该使用 DisallowConcurrentExecution
和 PersistJobDataAfterExecution
属性来实现您的目标。
其他 API
如果您创建了 Quartz 使用的服务的自定义实现,您将需要调整您的代码以使其基于异步。
作业存储序列化配置更改
现在,如果您在配置调度程序时使用持久作业存储 (AdoJobStore),则需要明确说明是要使用二进制还是 json 序列化。
- 对于现有设置,您应该使用旧的二进制序列化来确保事情像以前一样工作(请参阅 Quartz.Serialization.Json 文档了解迁移路径)
- 对于新项目,建议使用 JSON 序列化,因为它不处理二进制版本控制问题,它应该更快更健壮
- JSON 更安全,通常是向前使用的方式
如果您选择使用 JSON 序列化,请记住将 NuGet 包引用 Quartz.Serialization.Json 添加到您的项目中。
配置二进制序列化策略:
var properties = new NameValueCollection
{
["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz",
// "binary" is alias for "Quartz.Simpl.BinaryObjectSerializer, Quartz"
["quartz.serializer.type"] = "binary"
};
ISchedulerFactory sf = new StdSchedulerFactory(properties);
配置 JSON 序列化策略(推荐):
var properties = new NameValueCollection
{
["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz",
// "json" is alias for "Quartz.Simpl.JsonObjectSerializer, Quartz.Serialization.Json"
["quartz.serializer.type"] = "json"
};
ISchedulerFactory sf = new StdSchedulerFactory(properties);
简化的 job store provider 名称
ADO.NET 提供程序名称已简化,提供程序名称没有版本,例如 SqlServer-20
=> SqlServer
。 它们现在绑定到可以加载的任何版本。
C5 集合
C5 集合不再 ILMerged 在 Quartz 中,.NET 4.5 提供了所需的集合。
日志记录
Common.Logging 已替换为 LibLog ,以减少依赖项。 如果支持,LibLog 应该会自动检测您选择的日志记录框架。
远程处理
目前仅在完整框架版本上运行时才支持远程处理。