当前位置: 首页 > news >正文

.NET Core 如何使用 Quartz?

.NET Core 如何使用 Quartz?

在 .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 的基本配置。记得根据你的具体需求调整作业逻辑和调度策略。

http://www.dtcms.com/a/589108.html

相关文章:

  • excel下拉选项设置
  • 深入解析:利用EBS直接API实现增量快照与精细化数据管理(AWS)
  • 专门做石材地花设计的网站有哪些网站是免费学做网页的
  • [Godot] Google Play审核反馈:如何应对“您的游戏需要进行更多测试才能发布正式版”?
  • Rust 练习册 :深入探索可变长度数量编码
  • dify二次开发部署服务器
  • webrtc降噪-NoiseEstimator类源码分析与算法原理
  • 4.3 Boost 库工具类 optional 的使用
  • 帮人做网站要怎么赚钱吗吉林平安建设网站
  • 文广网站建设sq网站推广
  • Nop平台拆分出核心部分nop-kernel
  • 结构型设计模式1
  • 普中51单片机学习笔记-中断
  • 二十六、STM32的ADC(DMA+ADC)
  • 网站开发的著作权和版权网站品牌推广
  • 【Docker】docker compose
  • 4.1.8 【2022 统考真题】
  • 深圳网站设计官网番禺人才网上
  • Tailwind CSS的Flex布局
  • 深入解析 LeetCode 1:两数之和
  • 重庆网站制作福州嘉兴网络科技有限公司
  • OpenCV(二十二):图像的翻转与旋转
  • 权限维持:操作系统后门技术分析与防护
  • 网闸与防火墙:构建纵深防御的“门卫”与“断桥”
  • 室内设计找工作网站wordpress app源码
  • 河北seo网站优化公司光辉网站建设
  • android 网络访问拦截器使用后的bug处理
  • mysql视图和存储过程
  • VRRP的补充
  • 天津 交友 网站建设自建网站做外贸谷歌推广