.NET Core使用Quartz的实现示例

 更新时间:2026年01月12日 10:05:18   作者:Yashar Qian  
本文介绍了在.NET Core中使用Quartz.NET进行任务调度的完整流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在 .NET Core 中使用 Quartz.NET 可以分为以下几个主要步骤:

1. 安装 NuGet 包

dotnet add package Quartz
dotnet add package Quartz.Extensions.Hosting

2. 配置服务

Program.csStartup.cs 中配置 Quartz:

.NET 6+ 使用 Minimal API:

var builder = WebApplication.CreateBuilder(args);

// 添加 Quartz 服务
builder.Services.AddQuartz(q =>
{
    // 可选:配置 Quartz 选项
    q.UseMicrosoftDependencyInjectionJobFactory();
    
    // 创建作业键
    var jobKey = new JobKey("HelloWorldJob");
    
    // 注册作业
    q.AddJob<HelloWorldJob>(opts => opts.WithIdentity(jobKey));
    
    // 创建触发器
    q.AddTrigger(opts => opts
        .ForJob(jobKey)
        .WithIdentity("HelloWorldJob-trigger")
        .WithCronSchedule("0/5 * * * * ?")); // 每5秒执行一次
});

// 添加 Quartz 托管服务
builder.Services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true);

var app = builder.Build();
app.Run();

传统配置方式:

public void ConfigureServices(IServiceCollection services)
{
    services.AddQuartz(q =>
    {
        q.UseMicrosoftDependencyInjectionJobFactory();
        
        var jobKey = new JobKey("HelloWorldJob");
        q.AddJob<HelloWorldJob>(opts => opts.WithIdentity(jobKey));
        
        q.AddTrigger(opts => opts
            .ForJob(jobKey)
            .WithIdentity("HelloWorldJob-trigger")
            .WithCronSchedule("0 0/5 * * * ?")); // 每5分钟执行一次
    });

    services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true);
}

3. 创建作业

创建实现 IJob 接口的作业类:

using Quartz;

public class HelloWorldJob : IJob
{
    private readonly ILogger<HelloWorldJob> _logger;

    public HelloWorldJob(ILogger<HelloWorldJob> logger)
    {
        _logger = logger;
    }

    public async Task Execute(IJobExecutionContext context)
    {
        _logger.LogInformation("HelloWorldJob 执行于: {Time}", DateTime.Now);
        
        // 你的业务逻辑
        await Task.Delay(1000);
        
        _logger.LogInformation("HelloWorldJob 完成于: {Time}", DateTime.Now);
    }
}

4. 使用依赖注入的作业

如果你的作业需要其他服务,可以通过构造函数注入:

public class EmailJob : IJob
{
    private readonly IEmailService _emailService;
    private readonly ILogger<EmailJob> _logger;

    public EmailJob(IEmailService emailService, ILogger<EmailJob> logger)
    {
        _emailService = emailService;
        _logger = logger;
    }

    public async Task Execute(IJobExecutionContext context)
    {
        try
        {
            // 从 JobDataMap 获取参数
            var toEmail = context.JobDetail.JobDataMap.GetString("ToEmail");
            var subject = context.JobDetail.JobDataMap.GetString("Subject");
            
            await _emailService.SendAsync(toEmail, subject, "Hello from Quartz!");
            _logger.LogInformation("邮件发送成功");
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "邮件发送失败");
        }
    }
}

5. 配置多个作业和触发器

services.AddQuartz(q =>
{
    // 作业1:每5分钟执行
    var jobKey1 = new JobKey("ReportJob");
    q.AddJob<ReportJob>(opts => opts.WithIdentity(jobKey1));
    q.AddTrigger(opts => opts
        .ForJob(jobKey1)
        .WithIdentity("ReportJob-trigger")
        .WithCronSchedule("0 0/5 * * * ?"));
    
    // 作业2:每天凌晨2点执行
    var jobKey2 = new JobKey("CleanupJob");
    q.AddJob<CleanupJob>(opts => opts.WithIdentity(jobKey2));
    q.AddTrigger(opts => opts
        .ForJob(jobKey2)
        .WithIdentity("CleanupJob-trigger")
        .WithCronSchedule("0 0 2 * * ?"));
    
    // 作业3:简单的间隔调度
    var jobKey3 = new JobKey("HealthCheckJob");
    q.AddJob<HealthCheckJob>(opts => opts.WithIdentity(jobKey3));
    q.AddTrigger(opts => opts
        .ForJob(jobKey3)
        .WithIdentity("HealthCheckJob-trigger")
        .StartNow()
        .WithSimpleSchedule(x => x
            .WithIntervalInSeconds(30)
            .RepeatForever()));
});

6. 使用配置文件

appsettings.json 中配置:

{
  "Quartz": {
    "scheduler": {
      "instanceName": "MyScheduler"
    },
    "threadPool": {
      "type": "Quartz.Simpl.SimpleThreadPool, Quartz",
      "threadCount": 10
    },
    "jobStore": {
      "type": "Quartz.Simpl.RAMJobStore, Quartz"
    }
  }
}

7. 动态调度作业

你也可以在运行时动态调度作业:

public class JobSchedulerService
{
    private readonly ISchedulerFactory _schedulerFactory;

    public JobSchedulerService(ISchedulerFactory schedulerFactory)
    {
        _schedulerFactory = schedulerFactory;
    }

    public async Task ScheduleOneTimeJob<T>(DateTimeOffset startTime) where T : IJob
    {
        var scheduler = await _schedulerFactory.GetScheduler();
        
        var job = JobBuilder.Create<T>()
            .WithIdentity(Guid.NewGuid().ToString())
            .Build();
            
        var trigger = TriggerBuilder.Create()
            .WithIdentity(Guid.NewGuid().ToString())
            .StartAt(startTime)
            .Build();
            
        await scheduler.ScheduleJob(job, trigger);
    }
}

常用 Cron 表达式示例

  • "0 0/5 * * * ?" - 每5分钟
  • "0 0 * * * ?" - 每小时
  • "0 0 2 * * ?" - 每天凌晨2点
  • "0 0 9 ? * MON-FRI" - 工作日早上9点
  • "0 30 9 ? * MON" - 每周一早上9:30

这样你就完成了在 .NET Core 中集成和使用 Quartz.NET 的基本配置。记得根据你的具体需求调整作业逻辑和调度策略。

到此这篇关于.NET Core使用Quartz的实现示例的文章就介绍到这了,更多相关.NET Core Quartz内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • .net core 3.1 Redis安装和简单使用

    .net core 3.1 Redis安装和简单使用

    本文主要介绍了.net core 3.1 Redis安装和简单使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • iis中为每个应用程序池单独设置aspnet.config配置文件

    iis中为每个应用程序池单独设置aspnet.config配置文件

    ASP.NET2.0之后的版本就在各Framework的根目录下提供了一个aspnet.config文件,这个文件用来配置全局的一些信息,但是一直以来我们都没有怎么用过
    2011-12-12
  • C# ToString格式大全

    C# ToString格式大全

    需要将其它类型的变量,转换为字符串类型的一些常见方法与属性。
    2008-12-12
  • asp.net core 中优雅的进行响应包装的实现方法

    asp.net core 中优雅的进行响应包装的实现方法

    本文介绍了 Asp.Net Core 中的通用响应包装的实现,以及如何让 Swagger 识别响应包装,由于异常处理难以做到通用和一致,本文不处理异常情况下的响应包装,读者可以自定义实现 ExceptionFilter
    2022-01-01
  • asp.net DropDownList自定义控件,让你的分类更清晰

    asp.net DropDownList自定义控件,让你的分类更清晰

    记得上次做论坛,一个功能就是合并2个子板块的主题,用级联的2个DropDownList也是可以完成,那样我们要合并的时候总共就有4个DropDownList控件,觉得界面友好
    2011-10-10
  • .NET Core实现分表分库、读写分离的通用 Repository功能

    .NET Core实现分表分库、读写分离的通用 Repository功能

    这篇文章主要介绍了.NETCore 下支持分表分库、读写分离的通用 Repository,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Entity Framework表拆分为多个实体

    Entity Framework表拆分为多个实体

    这篇文章介绍了Entity Framework表拆分为多个实体的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • asp.net使用jquery模板引擎jtemplates呈现表格

    asp.net使用jquery模板引擎jtemplates呈现表格

    这篇文章主要介绍了asp.net使用jquery模板引擎jtemplates呈现表格的示例,大家参考使用吧
    2014-01-01
  • .Net Core WebApi的简单创建以及使用方法

    .Net Core WebApi的简单创建以及使用方法

    这篇文章主要给大家介绍了关于.Net Core WebApi的简单创建以及使用方法的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用.Net Core WebApi具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • .net中如何以纯二进制的形式在内存中绘制一个对象

    .net中如何以纯二进制的形式在内存中绘制一个对象

    这篇文章主要介绍了如何以纯二进制的形式在内存中绘制一个对象,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07

最新评论