如今有了一个官方包Quartz.Extensions.Hosting实现使用Quartz.Net运行后台任务,因此把Quartz.Net添加到ASP.NET Core或Worker Service要简单得多。json
我将展现如何把Quartz.Net HostedService添加到你的应用,如何建立一个简单的IJob,以及如何注册它与trigger。app
简介——什么是Quartz.Net异步
Quartz.Net是一个功能齐全的开源做业调度系统,能够在最小规模的应用程序到大型企业系统使用。函数
有许多ASP.NET的钉子户,他们以一种可靠的、集群的方式在定时器上运行后台任务。使用在ASP.NET Core中使用的Quartz.Net支持了.NET Standar 2.0,所以你能够轻松地在应用程序中使用它。测试
Quartz.Net有三个主要概念:ui
ASP.NET Core很好地支持经过hosted services(托管服务)运行“后台任务”。当你的ASP.NET Core应用程序启动,托管服务也启动,并在应用程序的生命周期中在后台运行。Quartz.Net 3.2.0经过Quartz.Extensions.Hosting引入了对该模式的直接支持。Quartz.Extensions.Hosting便可以用在ASP.NET Core应用程序,也能够用在基于“通用主机”的Worker Service。this
虽然能够建立一个“定时”后台服务(例如,每10分钟运行一个任务),但Quartz.NET提供了一个更加健壮的解决方案。经过使用Cron trigger,你能够确保任务只在一天的特定时间(例如凌晨2:30)运行,或者只在特定的日子运行,或者这些时间的任意组合运行。Quartz.Net还容许你以集群的方式运行应用程序的多个实例,以便在任什么时候候只有一个实例能够运行给定的任务。编码
Quartz.Net托管服务负责Quartz的调度。它将在应用程序的后台运行,检查正在执行的触发器,并在必要时运行相关的做业。你须要配置调度程序,但不须要担忧启动或中止它,IHostedService会为你管理。spa
在这篇文章中,我将展现建立Quartz.Net job的基础知识。并将其调度到托管服务中的定时器上运行。.net
安装Quartz.Net
Quartz.Net是一个.NET Standar 2.0的NuGet包,因此它很容易安装在你的应用程序中。对于这个测试,我建立了一个Worker Service项目。你能够经过使用dotnet add package Quartz.Extensions.Hosting命令安装Quartz.Net托管包。若是你查看项目的.csproj,它应该是这样的:
这将添加托管服务包,从而引入Quartz.Net。接下来,咱们须要在应用程序中注册Quartz.Net的服务和 IHostedService。
添加Quartz.Net托管服务
注册Quartz.Net须要作两件事:
在ASP.NET Core中,一般会在Startup.ConfigureServices()方法中完成这两项操做。Worker Services不使用Startup类,因此咱们在Program.cs中的IHostBuilder的ConfigureServices方法中注册它们:
若是你如今运行应用程序,将看到Quartz服务启动,并将大量日志转储到控制台:
此时,你已经让Quartz做为托管服务在你的应用程序中运行,可是没有任何job让它运行。在下一节中,咱们将建立并注册一个简单的job。
建立job
对于咱们正在调度的实际后台工做,咱们将使用一个"hello world"实现它写入一个ILogger<T>。你应该实现Quartz.NET的接口IJob,它包含一个异步的Execute()方法。注意,咱们在这里使用依赖注入将日志程序注入到构造函数中。
我还用[DisallowConcurrentExecution]属性装饰了job。此属性防止Quartz.NET试图同时运行相同的做业。
如今咱们已经建立了做业,咱们须要将它与trigger一块儿注册到DI容器中。
配置job
Quartz.NET为运行job提供了一些简单的schedule,但最多见的方法之一是使用Quartz.NET Cron表达式。Cron表达式容许复杂的计时器调度,因此你能够设置规则,好比“每月的5号和20号,在早上8点到10点之间每半小时触发一次”。使用时请确保检查示例文档,由于不一样系统使用的全部Cron表达式都是可互换的。
下面的示例展现了如何使用每5秒运行一次的trggier来注册HelloWorldJob:
这就实现了功能!再也不须要建立自定义的IJobFactory,也不用担忧是否支持scoped的服务。
默认的包为你处理全部这些问题——你能够在IJob中使用scoped的服务,它们将在job完成时被删除。
若是你如今运行你的应用程序,你会看到和之前同样的启动消息,而后每5秒你会看到HelloWorldJob写入控制台:
这就是启动和运行所需的所有内容,可是根据个人喜爱,在ConfigureServices方法中添加了太多内容。你也不太可能想在应用程序中硬编码做业调度。例如,若是将其提取到配置中,能够在每一个环境中使用不一样的调度。
最起码,咱们但愿将Cron调度提取到配置中。例如,你能够在appsettings.json中添加如下内容:
{ "Quartz": { "HelloWorldJob": "0/5 * * * * ?" } }
而后,你能够轻松地在不一样环境中覆盖HelloWorldJob的触发器调度。
为了方便注册,咱们能够建立一个扩展方法来封装在Quartz上注册IJob,并设置它的trigger调度。这段代码与前面的示例基本相同,可是它使用job的名称在IConfiguration中加载Cron调度。
再次运行应用程序会给出相同的输出:job每5秒写一次输出。
总结
在这篇文章中,我介绍了Quartz.NET并展现了如何使用新的Quartz.Extensions.Hosting轻松添加一个ASP.NET Core托管服务运行Quartz调度器。我展现了如何使用trigger实现一个简单的job,以及如何将其注册到应用程序中,以便托管的服务按计划运行它。
欢迎关注个人公众号,若是你有喜欢的外文技术文章,能够经过公众号留言推荐给我。
原文连接:https://andrewlock.net/using-quartz-net-with-asp-net-core-and-worker-services/