.net 6 配置QuartZ定时任务

        项目中需要用到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 keystring jobName = typeof(T).Name;// Try and load the schedule from configurationvar configKey = $"Quartz:{jobName}";var cronSchedule = config[configKey];// Some minor validationif (string.IsNullOrEmpty(cronSchedule)){throw new Exception($"No Quartz.NET Cron schedule found for job in configuration at {configKey}");}// register the job as beforevar 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 keystring jobName = typeof(T).Name;// Try and load the schedule from configurationvar configKey = $"Quartz:{jobName}";var cronSchedule = config[configKey];// Some minor validationif (string.IsNullOrEmpty(cronSchedule)){throw new Exception($"No Quartz.NET Cron schedule found for job in configuration at {configKey}");}// register the job as beforevar 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 configurationbreak;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 configurationbreak;}}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 configurationq.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实现定时任务_.net6 quartz-CSDN博客

KSO - 在.NET6中项目级使用配置Quartz.NET定时任务,并使用IHostedService实现项目启动自动加载任务,常用的Corn表达式_net6 webapi 在配置中引入注入quartz-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/820851.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【笔记】探索生成范式:大型语言模型在信息提取中的作用

探索生成范式&#xff1a;大型语言模型在信息提取中的作用 摘要介绍 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时光&#xff0c;感谢你的陪伴与支持 ~ &#x1f680; 欢迎一起踏上探险之旅&#xff0c;挖掘无限可能&#xff0c;共同成长&am…

JRebelXRebel在线激活

包含所有新旧版本&#xff0c;包括2023.4.2、2023.4.1、2023.4.0、2023.3.2、2023.3.1、2023.3.0、2023.2.2、2023.2.1、2023.2.0、2023.1.2、2023.1.1 等以及所有2022版本 JRebel&XRebel激活服务器地址 激活服务器地址&#xff08;路线1,推荐&#xff09; https://jrebe…

基于Qt的二维码生成与识别

基于Qt的二维码生成与识别 一、获取QZxing开源库 1.通过封装的QZxing开源库生成和识别二维码&#xff0c;下载地址&#xff1a;GitCode - 开发者的代码家园https://gitcode.com/mirrors/ftylitak/qzxing/tree/master。 2.下载解压后&#xff0c;使用Qt Creator xx&#xff0…

解决npm run dev跑项目,发现node版本不匹配,怎么跑起来?【已解决】

首先问题点就是我们npm run dev 运行项目的时候发现出错&#xff0c;跑不起来&#xff0c;类型下面这种 这里的出错的原因在于我们的node版本跟项目的版本不匹配 解决办法 我这里的问题是我的版本是node14的&#xff0c;然后项目需要node20的&#xff0c;执行下面的就可以正…

Vue3(二):报错调试,vue3响应式原理、computed和watch,ref,props,接口

一、准备工作调试 跟着张天禹老师看前几集的时候可能会遇到如下问题&#xff1a; 1.下载插件&#xff1a;Vue Language Features (Volar)或者直接下载vue-offical 2.npm run serve时运行时出现错误&#xff1a;Error: vitejs/plugin-vue requires vue (&#xff1e;3.2.13) …

Linux系统(centos,redhat,龙芯,麒麟等)忘记密码,怎么重置密码

Linux系统&#xff08;centos,redhat,龙芯&#xff0c;麒麟等&#xff09;忘记密码&#xff0c;怎么重置密码&#xff0c;怎么设置新的密码 今天在操作服务器时&#xff0c;DBA忘记了人大金仓数据库的kingbase密码&#xff0c;他的密码试了好多遍&#xff0c;都不行。最后只能…

2024-04-16 问AI: 介绍一下卷积网络VGG

某AI罢工了&#xff0c;看来一个AI是不保险的。 看来AI也要高可用。 文心一言 没有成功&#xff0c;提问人数过多。 智谱清言 VGG&#xff08;Visual Geometry Group&#xff09;网络是由牛津大学的视觉几何组提出的一种深层卷积神经网络结构&#xff0c;它在2014年的ImageNe…

目标检测算法——YOLOV9——算法详解

一、主要贡献 深度网络输入数据在逐层进行特征提取和空间变换时&#xff0c;会丢失大量的信息。针对 信息丢失问题&#xff0c;研究问题如下&#xff1a; 1&#xff09;从可逆功能的角度对现有深度神经网络架构进行了理论分析&#xff0c;解释了许多过去难以解释的现象&#xf…

JavaScript基础:js介绍、变量、数据类型以及类型转换

目录 介绍 引入方式 内部方式 外部形式 注释和结束符 单行注释 多行注释 结束符 输入和输出 输出 输入 变量 声明 赋值 关键字 变量名命名规则 常量 数据类型 数值类型 字符串类型 布尔类型 undefined 类型转换 隐式转换 显式转换 Number ✨介绍 &a…

Module Federation微前端应用拆分后 - request请求优化、私有化request|分发拦截器

1. 背景及目的 1.1 需求背景 随着应用的拆分&#xff0c;目前子应用有12个&#xff0c;这些子应用都使用的是同一个request实例。 前端支持后端切流&#xff0c;增加多个拦截器用于灰度 经手动梳理&#xff1a; 目前所有应用中有26个在使用的拦截器&#xff0c; 其中用于灰…

imgcat 工具

如果经常在远程服务器或嵌入式设备中操作图片&#xff0c;要查看图片效果&#xff0c;就要先把图片dump到本地&#xff0c;比较麻烦。可以使用这个工具&#xff0c;直接在终端上显示。类似于这种效果。 imgcat 是一个终端工具&#xff0c;使用 iTerm2 内置的特性&#xff0c;允…

加强fou循环的坑

今天遇到了一个有趣的事情&#xff0c;使用加强fou循环操作list时&#xff0c;会报错并发操作异常。 直到看了编译类&#xff0c;才发现&#xff0c;加强fou循环其实就是通过迭代器操作&#xff1a; 这里就会出现一个问题&#xff0c;迭代器在取出值时&#xff0c;就回去检测这…

elementUi el-date-picker时间控件精确到时分秒

1.时间日期typedatetime <template><el-date-pickerv-model"time":picker-options"pickerOptions"ref"datetime"type"datetime":default-time"range":disabled"disabled"placeholder"请选择日期时…

Spring Boot 定时任务实现教程

前言 在实际开发过程中&#xff0c;我们经常需要处理一些周期性或定时执行的任务&#xff0c;如数据备份、报表生成、邮件发送等。Spring Boot通过集成Quartz或使用Spring自带的Scheduled注解可以方便地实现定时任务功能。本文将详细介绍如何在Spring Boot项目中使用Scheduled…

【数据结构】遍历二叉树(递归和非递归遍历的先序、中序和后序遍历、层次遍历法)

目录 【数据结构】遍历二叉树&#xff08;递归和非递归遍历的先序、中序和后序遍历、层次遍历法&#xff09;一、递归算法先&#xff08;根&#xff09;序的遍历算法中&#xff08;根&#xff09;序的遍历算法后&#xff08;根&#xff09;序的遍历算法 二、非递归算法层次遍历…

存储器管理

01.存储器的层次结构&#xff1a;计算机在执行指令时&#xff0c;几乎每条指令都会涉及对存储器的访问&#xff0c;因此要求计算机对存储器的访问速度能跟得上处理机的运行速度&#xff0c;在现代计算机系统中&#xff0c;都采用了多层结构的存储器。至少应该有三层&#xff1a…

【漏洞复现】浙大恩特客户资源管理系统 i0004_openFileByStream.jsp 任意文件读取漏洞

0x01 产品简介 浙大恩特客户资源管理系统是一款外贸管理软件&#xff0c;它提供了多种功能&#xff0c;包括客户档案管理、邮件管理、OA外贸办公管理系统、分管权限管理、联系跟进及提醒、业务检查管理、统计分析管理等。 0x02 漏洞概述 浙大恩特客户资源管理系统存在任意文件…

ENSP-旁挂式AC

提醒&#xff1a;如果AC不能成功上线AP&#xff0c;一般问题不会出在AC上&#xff0c;优先关注AC-AP线路上的二层或三层组网的三层交换机 拓扑图 管理VLAN&#xff1a;99 | 业务VLAN&#xff1a;100 注意点&#xff1a; 1.连接AP的接口需要打上pvid为管理vlan的标签 2.AC和…

通用视觉大模型调研

humanbench HumanBench: Towards General Human-centric Perception with Projector Assisted Pretraining&#xff1b;为了解决不同任务之间的conflict以及不同dataset之间的差异(相同任务)&#xff0c;提出PATH&#xff0c;backbone是所有任务共享、projector是任务级别共享…