.NET Core使用Quartz的實現(xiàn)示例
在 .NET Core 中使用 Quartz.NET 可以分為以下幾個主要步驟:
1. 安裝 NuGet 包
dotnet add package Quartz dotnet add package Quartz.Extensions.Hosting
2. 配置服務(wù)
在 Program.cs 或 Startup.cs 中配置 Quartz:
.NET 6+ 使用 Minimal API:
var builder = WebApplication.CreateBuilder(args);
// 添加 Quartz 服務(wù)
builder.Services.AddQuartz(q =>
{
// 可選:配置 Quartz 選項
q.UseMicrosoftDependencyInjectionJobFactory();
// 創(chuàng)建作業(yè)鍵
var jobKey = new JobKey("HelloWorldJob");
// 注冊作業(yè)
q.AddJob<HelloWorldJob>(opts => opts.WithIdentity(jobKey));
// 創(chuàng)建觸發(fā)器
q.AddTrigger(opts => opts
.ForJob(jobKey)
.WithIdentity("HelloWorldJob-trigger")
.WithCronSchedule("0/5 * * * * ?")); // 每5秒執(zhí)行一次
});
// 添加 Quartz 托管服務(wù)
builder.Services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true);
var app = builder.Build();
app.Run();
傳統(tǒng)配置方式:
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分鐘執(zhí)行一次
});
services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true);
}
3. 創(chuàng)建作業(yè)
創(chuàng)建實現(xiàn) IJob 接口的作業(yè)類:
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 執(zhí)行于: {Time}", DateTime.Now);
// 你的業(yè)務(wù)邏輯
await Task.Delay(1000);
_logger.LogInformation("HelloWorldJob 完成于: {Time}", DateTime.Now);
}
}
4. 使用依賴注入的作業(yè)
如果你的作業(yè)需要其他服務(wù),可以通過構(gòu)造函數(shù)注入:
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 獲取參數(shù)
var toEmail = context.JobDetail.JobDataMap.GetString("ToEmail");
var subject = context.JobDetail.JobDataMap.GetString("Subject");
await _emailService.SendAsync(toEmail, subject, "Hello from Quartz!");
_logger.LogInformation("郵件發(fā)送成功");
}
catch (Exception ex)
{
_logger.LogError(ex, "郵件發(fā)送失敗");
}
}
}
5. 配置多個作業(yè)和觸發(fā)器
services.AddQuartz(q =>
{
// 作業(yè)1:每5分鐘執(zhí)行
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 * * * ?"));
// 作業(yè)2:每天凌晨2點執(zhí)行
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 * * ?"));
// 作業(yè)3:簡單的間隔調(diào)度
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. 動態(tài)調(diào)度作業(yè)
你也可以在運行時動態(tài)調(diào)度作業(yè):
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 的基本配置。記得根據(jù)你的具體需求調(diào)整作業(yè)邏輯和調(diào)度策略。
到此這篇關(guān)于.NET Core使用Quartz的實現(xiàn)示例的文章就介紹到這了,更多相關(guān).NET Core Quartz內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解析如何利用一個ASP.NET Core應(yīng)用來發(fā)布靜態(tài)文件
本文主要通過一些簡單的實例來體驗一下如何在一個ASP.NET Core應(yīng)用中發(fā)布靜態(tài)文件。針對不同格式的靜態(tài)文件請求的處理,ASP.NET Core為我們提供了三個中間件,它們將是本系列文章論述的重點。有需要的朋友可以看下2016-12-12
ASP.NET Core Project.json文件(5)
這篇文章主要為大家詳細介紹了ASP.NET Core Project.json文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06
asp.net Datalist控件實現(xiàn)分頁功能
asp.net Datalist控件實現(xiàn)分頁功能代碼。大家可以參考下。2009-07-07
解決ASP.NET中Type.GetType方法總返回空的問題
今天做練習的時候用到了Type.GetType方法。。 可是他總返回null。。2008-03-03
Asp.Net平臺下的圖片在線裁剪功能的實現(xiàn)代碼(源碼打包)
最近項目中有個圖片在線裁剪功能,本人查找資料,方法如下:前臺展現(xiàn)用jquery.Jcrop實現(xiàn),后臺使用 System.Drawing.Image類來進行裁剪2011-10-10

