.net 6 配置QuartZ定时任务的过程
项目中需要用到QuartZ执行定时任务,在此记录一下学习过程。
Quartz安装
在VS2022中,通过Nuget包管理器安装Quartz 3.8.1 ,这是.net 6 依赖的最高版本。
创建定时器任务
1、创建QuartzConfigurator
新建QuartzConfiguratorExtensions类,用于注册触发器和任务,代码如下:
////// 添加任务和触发器 /// ////// /// /// public static void AddJobAndTrigger (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 (opts => opts.WithIdentity(jobKey)); quartz.AddTrigger(opts => opts .ForJob(jobKey) .WithIdentity(jobName + "-trigger") .WithCronSchedule(cronSchedule)); // use the schedule from configuration } /// /// 添加任务和触发器(带参数传递) /// ////// /// /// 需要传递的参数 /// 默认通过 工作描述时传递参数 /// public static void AddJobAndTriggerWithParameter (this IServiceCollectionQuartzConfigurator quartz, IConfiguration config, IDictionary ? 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 (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 (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 (opts => opts .WithIdentity(jobKey)); quartz.AddTrigger(opts => opts .ForJob(jobKey) .WithIdentity(jobName + "-trigger") .WithCronSchedule(cronSchedule)); // use the schedule from configuration } }
2、在Program.cs 中注入服务
builder.Services.AddQuartz(q =>
{
创建计划单元(时间轴,载体)
//StdSchedulerFactory schedulerFactory = new StdSchedulerFactory();
//var scheduler = await schedulerFactory.GetScheduler();
//await scheduler.Start();
q.UseMicrosoftDependencyInjectionJobFactory();
// Register the job, loading the schedule from configuration
q.AddJobAndTrigger(builder.Configuration);
});
builder.Services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true); 3、创建工作单元WorkerJob
新建类TestWorkerJob,并继承IJob,代码如下:
[PersistJobDataAfterExecution]//在执行完成后,保留JobDataMap数据
[DisallowConcurrentExecution]//不允许并发执行,即必须等待上次完成后才能执行下一次
public class TestWorkerJob : IJob
{
private readonly ILogger _logger;
public TestWorkerJob(ILogger logger)
{
_logger = logger;
}
public Task Execute(IJobExecutionContext context)
{
_logger.LogInformation(DateTime.Now +" --- Hello world!");
Task.Delay(50000);
Thread.Sleep(10000);
return Task.CompletedTask;
}
} 假如我们的定时任务,执行一次需要耗时比较久,而且后一次执行需要等待前一次完成,并且需要前一次执行的结果作为参考,那么就需要设置任务的任性。因为默认情况下,工作单元在每一次运行都是一个新的实例,相互之间独立运行,互不干扰。所以如果需要存在一定的关联,就要设置任务的特性,主要有两个,如下所示:
[PersistJobDataAfterExecution]//在执行完成后,保留JobDataMap数据
[DisallowConcurrentExecution]//不允许并发执行,即必须等待上次完成后才能执行下一次
以上两个特性,只需要标记在任务对应的类上即可。
4、appsettings.json配置
在appsettings.json文件中添加一项Quartz,子项的必须与WorkerJob的名字保持一致,value是Cron表达式
{
"Quartz": {
"FromKingdeeWorkerJob": "0/5 * * * * ?"
}
}然后,启动项目,就可以看到任务可以正常运行啦。
最后
最后附上学习链接,
.NET6+Quartz实现定时任务
KSO - 在.NET6中项目级使用配置Quartz.NET定时任务,并使用IHostedService实现项目启动自动加载任务,常用的Corn表达式_net6 webapi 在配置中引入注入quartz
到此这篇关于.net 6 配置QuartZ定时任务的文章就介绍到这了,更多相关.net 6 QuartZ定时任务内容请搜索科站长以前的文章或继续浏览下面的相关文章希望大家以后多多支持科站长!
上一篇:如何使用.NET8 创建使用MySQL数据库的webapi项目
栏 目:ASP.NET
下一篇:在.NET6中使用配置Quartz.NET定时任务并使用IHostedService实现项目启动自动加载任务
本文地址:https://www.fushidao.cc/wangluobiancheng/3229.html
您可能感兴趣的文章
- 07-12ASP.NET刷新操作有哪些高效技巧?ASP.NET刷新最佳实践
- 07-12ASP制作网站有哪些常见技巧?ASP网站开发注意事项
- 07-12asp网站图片修改方法详解,是直接编辑代码还是使用图形编辑软件?asp网站图片怎么改
- 07-12如何通过 ASP 有效地修改和更新 HTML 代码片段?ASP修改HTML
- 07-12销售如何有效提升ASP?提升平均销售价格策略
- 07-12IIS配置ASP运行遇到难题?深度解析设置流程及常见问题!
- 07-12ASP图片上传漏洞如何修复,ASP防止图片上传的几种方法
- 07-12ASP表单重复提交问题解析,究竟如何有效防止表单多次提交?ASP防止表单重复提交
- 07-12asp中判断图片输出的方法及技巧有哪些?如何确保图片正确输出?
- 07-12ASP中截取当前时间的正确方法是什么?ASP获取当前时间
阅读排行
- 1ASP.NET刷新操作有哪些高效技巧?ASP.NET刷新最佳实践
- 2ASP制作网站有哪些常见技巧?ASP网站开发注意事项
- 3asp网站图片修改方法详解,是直接编辑代码还是使用图形编辑软件?asp网站图片怎么改
- 4如何通过 ASP 有效地修改和更新 HTML 代码片段?ASP修改HTML
- 5销售如何有效提升ASP?提升平均销售价格策略
- 6IIS配置ASP运行遇到难题?深度解析设置流程及常见问题!
- 7ASP图片上传漏洞如何修复,ASP防止图片上传的几种方法
- 8ASP表单重复提交问题解析,究竟如何有效防止表单多次提交?ASP防止表单重复提交
- 9asp中判断图片输出的方法及技巧有哪些?如何确保图片正确输出?
- 10ASP中截取当前时间的正确方法是什么?ASP获取当前时间
推荐教程
- 02-01ASP如何打开?掌握正确方法,轻松运行ASP文件
- 07-25在 .NET 中 使用 ANTLR4构建语法分析器的方法
- 07-25ASP.NET中Onclick与OnClientClick遇到的问题
- 07-25ASP.NET Core 模型验证消息的本地化新姿势详解
- 07-25Asp.NET Core WebApi 配置文件详细说明
- 07-25Math.NET Numerics 开源数学库安装使用详解
- 02-01ASP调用方法详解,从入门到精通
- 09-13asp.NET是前端还是后端
- 03-31详解如何在.NET代码中使用本地部署的Deepseek语言模型
- 07-25.NET Core 实现缓存的预热的方式
