.NET Core使用Quartz的实现示例
在 .NET Core 中使用 Quartz.NET 可以分为以下几个主要步骤:
1. 安装 NuGet 包
dotnet add package Quartz dotnet add package Quartz.Extensions.Hosting
2. 配置服务
在 Program.cs 或 Startup.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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
iis中为每个应用程序池单独设置aspnet.config配置文件
ASP.NET2.0之后的版本就在各Framework的根目录下提供了一个aspnet.config文件,这个文件用来配置全局的一些信息,但是一直以来我们都没有怎么用过2011-12-12
asp.net DropDownList自定义控件,让你的分类更清晰
记得上次做论坛,一个功能就是合并2个子板块的主题,用级联的2个DropDownList也是可以完成,那样我们要合并的时候总共就有4个DropDownList控件,觉得界面友好2011-10-10
.NET Core实现分表分库、读写分离的通用 Repository功能
这篇文章主要介绍了.NETCore 下支持分表分库、读写分离的通用 Repository,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-04-04
asp.net使用jquery模板引擎jtemplates呈现表格
这篇文章主要介绍了asp.net使用jquery模板引擎jtemplates呈现表格的示例,大家参考使用吧2014-01-01


最新评论