.net 6 配置QuartZ定时任务的过程

 更新时间:2024年04月19日 11:51:56   作者:菜鸟Coco  
这篇文章主要介绍了.net 6 配置QuartZ定时任务的过程,在VS2022中,通过Nuget包管理器安装Quartz 3.8.1 ,这是.net 6 依赖的最高版本,在此记录学习一下,需要的朋友可以参考下

项目中需要用到QuartZ执行定时任务,在此记录一下学习过程。

Quartz安装

在VS2022中,通过Nuget包管理器安装Quartz 3.8.1 ,这是.net 6 依赖的最高版本。

创建定时器任务

1、创建QuartzConfigurator

        新建QuartzConfiguratorExtensions类,用于注册触发器和任务,代码如下:

 /// <summary>
 /// 添加任务和触发器
 /// </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>
 /// 添加任务和触发器(带参数传递)
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="quartz"></param>
 /// <param name="config"></param>
 /// <param name="keyValuePairs">需要传递的参数</param>
 /// <param name="IsTriggerJobDataMap">默认通过 工作描述时传递参数</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 中注入服务

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<FromKingdeeWorkerJob>(builder.Configuration);
});
builder.Services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true);

 3、创建工作单元WorkerJob

        新建类TestWorkerJob,并继承IJob,代码如下:

 [PersistJobDataAfterExecution]//在执行完成后,保留JobDataMap数据
 [DisallowConcurrentExecution]//不允许并发执行,即必须等待上次完成后才能执行下一次
 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;
     }
 }

        假如我们的定时任务,执行一次需要耗时比较久,而且后一次执行需要等待前一次完成,并且需要前一次执行的结果作为参考,那么就需要设置任务的任性。因为默认情况下,工作单元在每一次运行都是一个新的实例,相互之间独立运行,互不干扰。所以如果需要存在一定的关联,就要设置任务的特性,主要有两个,如下所示:

[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定时任务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • .Net Core创建Api进行文件上传功能

    .Net Core创建Api进行文件上传功能

    这篇文章主要介绍了.Net Core创建Api进行文件上传,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • asp.net Cookie操作类

    asp.net Cookie操作类

    Cookie操作类,本人得还很不错哦。
    2009-12-12
  • Asp.net发送邮件的两种方法小结

    Asp.net发送邮件的两种方法小结

    这几天看了一下Asp.net发送邮件方面的东西,记得之前的IIS6上有SMTP服务器,可以直接利用这个进行邮件发送,现在的开发环境是Windows 7,找了半天没有找到,到网络上查了才知道原来windows 7和Vista都将SMTP服务器去掉了,现在将两种方法总结一下。
    2010-06-06
  • 基于asp.net MVC 应用程序的生命周期(详解)

    基于asp.net MVC 应用程序的生命周期(详解)

    下面小编就为大家分享一篇基于asp.net MVC 应用程序的生命周期详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • MVC+EasyUI+三层新闻网站建立 后台登录界面的搭建(二)

    MVC+EasyUI+三层新闻网站建立 后台登录界面的搭建(二)

    这篇文章主要为大家详细介绍了MVC+EasyUI+三层新闻网站建立的第二篇,教大家如何搭建后台登录界面,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • ASP.NET MVC实现下拉框多选

    ASP.NET MVC实现下拉框多选

    这篇文章介绍了ASP.NET MVC实现下拉框多选的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • 使CheckBoxList的Attributes属性生效(修改微软的一个bug)

    使CheckBoxList的Attributes属性生效(修改微软的一个bug)

    使CheckBoxList的Attributes属性生效(修改微软的一个bug)...
    2007-08-08
  • 小心!ASP.NET网站发布时的那些坑

    小心!ASP.NET网站发布时的那些坑

    ASP.NET网站发布时的那些坑,要小心了,为什么网站发布后,每个页面第一次打开都很卡?ASP.NET session 频繁丢失如何解决?具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • 详解如何在ASP.NET Core中使用Route特性

    详解如何在ASP.NET Core中使用Route特性

    这篇文章主要介绍了如何在ASP.NET Core中使用Route特性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • asp.net截屏功能实现截取web页面

    asp.net截屏功能实现截取web页面

    这篇文章主要介绍了asp.net截屏功能实现截取web页面,是非常实用的一个功能,需要的朋友可以参考下
    2014-08-08

最新评论