ASP.NET Core托管运行Quartz.NET作业调度详解

Quartz.NET这么NB的作业调度系统,不会还行?

今天介绍一下Quartz.NET的托管运行,官网传送门。

一、前言

Quartz.NET,按官网上的说法,是一款功能齐全的任务调度系统,从小型应用到大型企业级系统都能适用。在众多项目中,Quartz.NET以可靠、集群的方式,被用作在定时器上运行后台任务的一种方式。

Quartz.NET主要完成两个方面的内容:

基于时间计划的后台作业;

基于因时间计划的触发的任务运行。

ASP.NET Core本身对于通过托管服务运行后台任务就支持的很好。当ASP.NET启动托管服务时,应用程序启动,并在生命周期内在后台运行。通过创建Quartz.NET托管服务,可以使用标准的.Net Core托管服务,在后台运行任务。

Quartz.NET可以创建定时的任务,例如每十分钟运行一个任务。除此之外,Quartz.NET还可以通过Cron触发器,定义任务在特定的日子或特定的时间运行,例如每天凌晨两点执行一个任务。它还允许以集群的方式运行应用程序的多个实例,以便在任何时间确保只有一个实例运行给定的任务。

下面,就针对这些特性和功能,进行详细的说明。

    为防止非授权转发,这儿给出本文的原文链接:https://www.cnblogs.com/tiger-wang/p/13861121.html

二、安装Quartz.NET

Quartz.NET提供了NuGet包,所以安装很简单:

% dotnet add package quartz

这是个司机就知道,不详说了。

看一下安装后的.csproj文件内容:

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="quartz" Version="3.2.2" />
  </ItemGroup>
</Project>
三、通过IJob创建任务类

我们用个例子来说明 - 创建一个Demo的实现。它将写入ILogger<>。我们会使用Quartz.NET的接口IJob来实现,并使用依赖注入将日志注入到构造函数中。

[DisallowConcurrentExecution]
public class DemoJob : IJob
{
    private readonly ILogger<DemoJob> _logger;
    public DemoJob(ILogger<DemoJob> logger)
    
{
        _logger = logger;
    }

    public Task Execute(IJobExecutionContext context)
    
{
        _logger.LogInformation("Demo !");
        return Task.CompletedTask;
    }
}

在类的前面,我用了一个DisallowConcurrentExecution属性。这个属性可以防止Quartz.NET同时运行相同的作业。

四、通过IJobFactory创建任务工厂

通常情况下,Quartz.NET会使用Activator.CreateInstance来创建作业的实例。

在我们这个例子里,我们换一种方式。使用IJobFactory实现,并与ASP.NET Core的依赖注入容器挂钩。

public class SingletonJobFactory : IJobFactory
{
    private readonly IServiceProvider _serviceProvider;
    public SingletonJobFactory(IServiceProvider serviceProvider)
    
{
        _serviceProvider = serviceProvider;
    }

    public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
    
{
        return _serviceProvider.GetRequiredService(bundle.JobDetail.JobType) as IJob;
    }

    public void ReturnJob(IJob job)
    
{
    }
}

这个IJobFactory的实现,在构造函数中引入IServiceProvider,并实现接口。

接口中,最重要的是NewJob()方法。这个方法需要返回Quartz.NET调度器请求的IJob。在我们的例子中,我们直接委托给IServiceProvider,并让DI容器找到所需的实例。

ReturnJob()方法是调度程序返回和销毁IJobFactory创建的作业的地方。不过,因为我们使用了IServiceProvider,而它没有提供这样的处理。所以,从安全的角度,应该使用单例作业。

五、配置作业

在第三节中,我们创建了一个IJob的实现。这个实现直接使用就可以。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wspddg.html