.net?6?配置QuartZ定時任務(wù)的過程
項目中需要用到QuartZ執(zhí)行定時任務(wù),在此記錄一下學(xué)習(xí)過程。
Quartz安裝
在VS2022中,通過Nuget包管理器安裝Quartz 3.8.1 ,這是.net 6 依賴的最高版本。
創(chuàng)建定時器任務(wù)
1、創(chuàng)建QuartzConfigurator
新建QuartzConfiguratorExtensions類,用于注冊觸發(fā)器和任務(wù),代碼如下:
/// <summary>
/// 添加任務(wù)和觸發(fā)器
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="quartz"></param>
/// <param name="config"></param>
/// <exception cref="Exception"></exception>
public static void AddJobAndTrigger<T>(this IServiceCollectionQuartzConfigurator quartz, IConfiguration config) where T : IJob
{
// Use the name of the IJob as the appsettings.json key
string jobName = typeof(T).Name;
// Try and load the schedule from configuration
var configKey = $"Quartz:{jobName}";
var cronSchedule = config[configKey];
// Some minor validation
if (string.IsNullOrEmpty(cronSchedule))
{
throw new Exception($"No Quartz.NET Cron schedule found for job in configuration at {configKey}");
}
// register the job as before
var jobKey = new JobKey(jobName);
quartz.AddJob<T>(opts => opts.WithIdentity(jobKey));
quartz.AddTrigger(opts => opts
.ForJob(jobKey)
.WithIdentity(jobName + "-trigger")
.WithCronSchedule(cronSchedule)); // use the schedule from configuration
}
/// <summary>
/// 添加任務(wù)和觸發(fā)器(帶參數(shù)傳遞)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="quartz"></param>
/// <param name="config"></param>
/// <param name="keyValuePairs">需要傳遞的參數(shù)</param>
/// <param name="IsTriggerJobDataMap">默認(rèn)通過 工作描述時傳遞參數(shù)</param>
/// <exception cref="Exception"></exception>
public static void AddJobAndTriggerWithParameter<T>(this IServiceCollectionQuartzConfigurator quartz, IConfiguration config,
IDictionary<string, object>? keyValuePairs = null, bool isJobDetailJobDataMap = true) where T : IJob
{
// Use the name of the IJob as the appsettings.json key
string jobName = typeof(T).Name;
// Try and load the schedule from configuration
var configKey = $"Quartz:{jobName}";
var cronSchedule = config[configKey];
// Some minor validation
if (string.IsNullOrEmpty(cronSchedule))
{
throw new Exception($"No Quartz.NET Cron schedule found for job in configuration at {configKey}");
}
// register the job as before
var jobKey = new JobKey(jobName);
if (keyValuePairs != null && isJobDetailJobDataMap)
{
switch (isJobDetailJobDataMap)
{
case true:
quartz.AddJob<T>(opts => opts
.WithIdentity(jobKey)
.UsingJobData(new JobDataMap(keyValuePairs)));
quartz.AddTrigger(opts => opts
.ForJob(jobKey)
.WithIdentity(jobName + "-trigger")
.WithCronSchedule(cronSchedule)); // use the schedule from configuration
break;
case false:
quartz.AddJob<T>(opts => opts
.WithIdentity(jobKey));
quartz.AddTrigger(opts => opts
.ForJob(jobKey)
.WithIdentity(jobName + "-trigger")
.WithCronSchedule(cronSchedule)
.UsingJobData(new JobDataMap(keyValuePairs))); // use the schedule from configuration
break;
}
}
else
{
quartz.AddJob<T>(opts => opts
.WithIdentity(jobKey));
quartz.AddTrigger(opts => opts
.ForJob(jobKey)
.WithIdentity(jobName + "-trigger")
.WithCronSchedule(cronSchedule)); // use the schedule from configuration
}
}2、在Program.cs 中注入服務(wù)
builder.Services.AddQuartz(q =>
{
創(chuàng)建計劃單元(時間軸,載體)
//StdSchedulerFactory schedulerFactory = new StdSchedulerFactory();
//var scheduler = await schedulerFactory.GetScheduler();
//await scheduler.Start();
q.UseMicrosoftDependencyInjectionJobFactory();
// Register the job, loading the schedule from configuration
q.AddJobAndTrigger<FromKingdeeWorkerJob>(builder.Configuration);
});
builder.Services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true);3、創(chuàng)建工作單元WorkerJob
新建類TestWorkerJob,并繼承IJob,代碼如下:
[PersistJobDataAfterExecution]//在執(zhí)行完成后,保留JobDataMap數(shù)據(jù)
[DisallowConcurrentExecution]//不允許并發(fā)執(zhí)行,即必須等待上次完成后才能執(zhí)行下一次
public class TestWorkerJob : IJob
{
private readonly ILogger<TesteWorkerJob> _logger;
public TestWorkerJob(ILogger<TestWorkerJob> logger)
{
_logger = logger;
}
public Task Execute(IJobExecutionContext context)
{
_logger.LogInformation(DateTime.Now +" --- Hello world!");
Task.Delay(50000);
Thread.Sleep(10000);
return Task.CompletedTask;
}
}假如我們的定時任務(wù),執(zhí)行一次需要耗時比較久,而且后一次執(zhí)行需要等待前一次完成,并且需要前一次執(zhí)行的結(jié)果作為參考,那么就需要設(shè)置任務(wù)的任性。因為默認(rèn)情況下,工作單元在每一次運行都是一個新的實例,相互之間獨立運行,互不干擾。所以如果需要存在一定的關(guān)聯(lián),就要設(shè)置任務(wù)的特性,主要有兩個,如下所示:
[PersistJobDataAfterExecution]//在執(zhí)行完成后,保留JobDataMap數(shù)據(jù)
[DisallowConcurrentExecution]//不允許并發(fā)執(zhí)行,即必須等待上次完成后才能執(zhí)行下一次
以上兩個特性,只需要標(biāo)記在任務(wù)對應(yīng)的類上即可。
4、appsettings.json配置
在appsettings.json文件中添加一項Quartz,子項的必須與WorkerJob的名字保持一致,value是Cron表達(dá)式
{
"Quartz": {
"FromKingdeeWorkerJob": "0/5 * * * * ?"
}
}然后,啟動項目,就可以看到任務(wù)可以正常運行啦。
最后
最后附上學(xué)習(xí)鏈接,
到此這篇關(guān)于.net 6 配置QuartZ定時任務(wù)的文章就介紹到這了,更多相關(guān).net 6 QuartZ定時任務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
.NET中實現(xiàn)對象數(shù)據(jù)映射示例詳解
這篇文章主要為大家介紹了.NET中實現(xiàn)對象數(shù)據(jù)映射示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10
.NET使用原生方法實現(xiàn)文件壓縮和解壓的詳細(xì)過程
這篇文章主要介紹了.NET使用原生方法實現(xiàn)文件壓縮和解壓,本文我們主要講的是如何使用.NET原生方法System.IO.Compression命名空間中的類來對文件和文件夾進行壓縮或解壓縮(壓縮格式.zip文件格式),需要的朋友可以參考下2024-06-06
詳解.Net core2.0日志組件Log4net、Nlog簡單性能測試
這篇文章主要介紹了詳解.Net core2.0日志組件Log4net、Nlog簡單性能測試,比較log4net、nlog的文件寫入性能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-07-07
Asp.Net 網(wǎng)站優(yōu)化系列之?dāng)?shù)據(jù)庫優(yōu)化措施 使用主從庫(全)
網(wǎng)站規(guī)模到了一定程度之后,該分的也分了,該優(yōu)化的也做了優(yōu)化,但是還是不能滿足業(yè)務(wù)上對性能的要求;這時候我們可以考慮使用主從庫。2010-06-06
Asp.net Core中如何使用中間件來管理websocket
這篇文章主要給大家介紹了關(guān)于Asp.net Core中如何使用中間件來管理websocket的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09
ASP.NET對HTML頁面元素進行權(quán)限控制(三)
界面每個元素的權(quán)限也是需要控制的。比如一個查詢用戶的界面里面有查詢用戶按鈕,添加用戶按鈕,刪除用戶按鈕,不同的角色我們得分配不同的權(quán)限2013-12-12

