当前位置: 首页 > news >正文

如何在 ASP.NET Core 中使用 Quartz.NET

当我们在web开发中,常常会遇到这么一个需求,在后台执行某一项具体的任务,具体的说就是这些任务必须在后台定时执行。

Quartz.NET 是一个开源的 JAVA 移植版,它有着悠久的历史并且提供了强大的 Cron 表达式,这篇我们就来讨论如何在 ASP.NET Core 中使用 Quartz.NET 去执行一些后台任务。

一:安装 Quartz.NET:

要想使用 Quartz.NET,你可以使用 Visual Studio 2019 中的 NuGet package manager 可视化界面进行安装;

二:Quartz.NET 中的Job,triggers 和 Schedulers

1.Quartz.NET 里有三个非常重要的概念:任务,触发器 和 调度器,对应着 Job,Trigger 和 2.Schedulers,Job 表示一个你需要被执行的任务,任务中可以写上你的业务逻辑代码,Job 就是一个实现了 IJob 接口的子类。
Trigger 通常用于指定一个 job 是如何被调度的? 什么意思呢? 比如说:这个job是按天执行? 还是按小时执行?还是按秒执行?值得注意的是因为支持了 Cron 表达式,还能够实现更加超级复杂的调度逻辑。
3.Scheduler 通常按照你预先设置的调度规则将 job 丢给它的任务队列,并按照 trigger 规则轮询然后执行任务。

三:创建Job:

using Microsoft.Extensions.Logging;
using Quartz;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;namespace Services
{[DisallowConcurrentExecution]public class NotificationJob : IJob{private readonly ILogger<NotificationJob> _logger;public NotificationJob(ILogger<NotificationJob> logger){_logger = logger;}public Task Execute(IJobExecutionContext context){//此处可以写业务逻辑_logger.LogInformation("Hello world!"+DateTime.Now);return Task.CompletedTask;}}}

三:创建 JobMetadata 存储你的 job 元数据:

我准备定义一个 JobMetadata 类去存储和job 相关联的元数据,比如说:job的id,job的name 等等,下面的代码展示了如何定义这么一个类。

public class JobMetadata{public Guid JobId { get; set; }public Type JobType { get; }public string JobName { get; }public string CronExpression { get; }public JobMetadata(Guid Id, Type jobType, string jobName,string cronExpression){JobId = Id;JobType = jobType;JobName = jobName;CronExpression = cronExpression;}}

三: 创建scheduler:

为了方便实现 开启 和 停止 功能,我准备封装一个 hosting service 类,做法就是从 IHostingService 接口派生出一个 CustomQuartzHostedService 类,完整代码如下:

public class CustomQuartzHostedService : IHostedService{private readonly ISchedulerFactory schedulerFactory;private readonly IJobFactory jobFactory;private readonly JobMetadata jobMetadata;public CustomQuartzHostedService(ISchedulerFactory schedulerFactory,JobMetadata jobMetadata,IJobFactory jobFactory){this.schedulerFactory = schedulerFactory;this.jobMetadata = jobMetadata;this.jobFactory = jobFactory;}public IScheduler Scheduler { get; set; }public async Task StartAsync(CancellationToken cancellationToken){Scheduler = await schedulerFactory.GetScheduler();Scheduler.JobFactory = jobFactory;var job = CreateJob(jobMetadata);var trigger = CreateTrigger(jobMetadata);await Scheduler.ScheduleJob(job, trigger, cancellationToken);await Scheduler.Start(cancellationToken);}public async Task StopAsync(CancellationToken cancellationToken){await Scheduler?.Shutdown(cancellationToken);}private ITrigger CreateTrigger(JobMetadata jobMetadata){return TriggerBuilder.Create().WithIdentity(jobMetadata.JobId.ToString()).WithCronSchedule(jobMetadata.CronExpression).WithDescription($"{jobMetadata.JobName}").Build();}private IJobDetail CreateJob(JobMetadata jobMetadata){return JobBuilder.Create(jobMetadata.JobType).WithIdentity(jobMetadata.JobId.ToString()).WithDescription($"{jobMetadata.JobName}").Build();}}

三:修改启动配置:

var scheduler = StdSchedulerFactory.GetDefaultScheduler().GetAwaiter().GetResult();services.AddSingleton(scheduler);services.AddHostedService<CustomQuartzHostedService>();services.AddRazorPages();services.AddSingleton<IJobFactory, CustomQuartzJobFactory>();services.AddSingleton<ISchedulerFactory, StdSchedulerFactory>();services.AddSingleton<NotificationJob>();services.AddSingleton(new JobMetadata(Guid.NewGuid(), typeof(NotificationJob), "Notification Job", "0/5 * * * * ?"));services.AddHostedService<CustomQuartzHostedService>();

四:参照:https://blog.csdn.net/huangxinchen520/article/details/112060597

相关文章:

如何在 ASP.NET Core 中使用 Quartz.NET

当我们在web开发中&#xff0c;常常会遇到这么一个需求&#xff0c;在后台执行某一项具体的任务&#xff0c;具体的说就是这些任务必须在后台定时执行。 Quartz.NET 是一个开源的 JAVA 移植版&#xff0c;它有着悠久的历史并且提供了强大的 Cron 表达式&#xff0c;这篇我们就…...

阿里云3M固定带宽服务器速度快吗?是否够用?

阿里云服务器3M带宽下载速度是384KB/秒&#xff0c;上传速度是1280KB/s&#xff08;折合1.25M/秒&#xff09;&#xff0c;3M固定带宽够用吗&#xff1f;对于一般流量不是太大的个人博客、企业官网、论坛社区、小型电商网站或搭建个人学习环境或测试环境是完全够用的&#xff0…...

跨越行业边界,CodeMeter护航AI领域安全与合规

在人工智能&#xff08;AI&#xff09;技术如ChatGPT的推动下&#xff0c;工业视觉、医疗诊断和智能驾驶等领域正在经历重大变革。这些技术不仅扩大了应用范围&#xff0c;也带来了数据安全、软件授权保护和合规性等新挑战。 AI工业视觉正在推动制造和自动化的快速发展&#x…...

地磁传感器在城市交通智能监控系统的作用

地磁传感器的功能作用 地磁传感器的功能是相当强大的&#xff1a;当驾驶员把车辆停在车位上&#xff0c;地磁传感器能自动感应车辆的到来并开始计时&#xff1b;待车辆要离开时&#xff0c;传感器会自动把停车时间传送到中继站进行计费。因此&#xff0c;解决停车收费效率低下…...

自动解决IP冲突的问题 利用批处理更改末位IP循环+1直到网络畅通为止 解放双手 事半功倍

好久没出来写点什么了&#xff0c;难道今天有点时间&#xff0c;顺便把这两天碰到的问题出个解决方法吧。 这几天去客户那儿解决网络问题&#xff0c;因为客户的网络是固定的静态IP&#xff0c;因为没做MAC绑定&#xff0c;IP固定在本地电脑上&#xff0c;只要上不了网&#xf…...

目标检测 Faster RCNN全面解读复现

Faster RCNN 解读 经过R-CNN和Fast RCNN的积淀&#xff0c;Ross B. Girshick在2016年提出了新的Faster RCNN&#xff0c;在结构上&#xff0c;Faster RCNN已经将特征抽取(feature extraction)&#xff0c;proposal提取&#xff0c;bounding box regression(rect refine)&…...

HarmonyOS ArkTS 基础组件的使用(四)

1 组件介绍 组件&#xff08;Component&#xff09;是界面搭建与显示的最小单位&#xff0c;HarmonyOS ArkUI声明式开发范式为开发者提供了丰富多样的UI组件&#xff0c;我们可以使用这些组件轻松的编写出更加丰富、漂亮的界面。 组件根据功能可以分为以下五大类&#xff1a;…...

elasticsearch 7安装

问题提前报 max virtual memory areas error max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] 如果您的环境是Linux&#xff0c;注意要做以下操作&#xff0c;否则es可能会启动失败 1 用编辑工具打开文件/etc/sysctl.conf 2 …...

opencv 存储bgr格式/同理可类推yuv

需求背景 开发rk3588 音视频硬件编解码&#xff0c;然后看见他的输入文件格式。。 只能是裸的文件。不能是压缩过的。就是不能是jpg/png这种格式&#xff0c;只能是以下的图像/视频 的存储格式.那么我没有这个格式的&#xff0c;以前hi3559的bgr格式和他要的也不太一致&#x…...

[架构之路-248]:目标系统 - 设计方法 - 软件工程 - 需求工程- 需求开发:如何用图形表达需求,结构化需求分析与面向对象需求分析的比较与融合

目录 前言&#xff1a; 一、结构化和面向对象方法上的区别 二、结构化与面向对象分析方法优缺点比较 三、结构化方法与面向对象方法的融合使用 四、结构化方法与面向对象方法的相辅相成完成软件开发 前言&#xff1a; 结构化软件开发方法和面向对象的软件开发方法&#x…...

[数据结构]-AVL树

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、AVL树基…...

内存池的面试整理

文章思路来源 如何实现无锁申请&#xff1f; 每个线程申请自己的TreadCacheTLS对象&#xff0c;来管理自己的freeList数组。小内存的大小&#xff1f; 0-256K&#xff0c;并且对申请到的内存进行字节对齐&#xff0c;保证申请到的内存可以映射到对应的freeList中。映射规则&am…...

优化记录 -- 记一次搜索引擎(SOLR)优化

业务场景 某服务根据用户相关信息&#xff0c;使用搜索引擎进行数据检索 软件配置 solr 1台&#xff1a;32c 64g 数据10gb左右&#xff0c;版本 7.5.5 应用服务器1台&#xff1a;16c 64g 应用程序 3节点 问题产生现象 1、因业务系统因处理能不足&#xff0c;对业务系统硬件…...

电力感知边缘计算网关产品设计方案-网关系统通信架构方案

1.边缘协同控制模发 能针对建筑、充电桩、分布式储能、分布式光伏等典型设备建立对应物模型、完成数据采集通信协议设计和控制指令交互设计,能针对建筑、充换电站等典型场景提出具体实施方案和人工智能控制算法和逻辑。物模型、通信协议设计和控制指令交互设计科学、先进,能…...

RabbitMQ消息的可靠性

RabbitMQ消息的可靠性 一 生产者的可靠性 生产者重试 有时候由于网络问题&#xff0c;会出现连接MQ失败的情况&#xff0c;可以配置重连机制 注意&#xff1a;SpringAMQP的重试机制是阻塞式的&#xff0c;重试等待的时候&#xff0c;当前线程会等待。 spring:rabbitmq:conne…...

Opengl 纹理(知识点)

纹理&#xff08;知识点&#xff09; 以下是纹理用到的知识点&#xff0c;至于具体流程操作请参考&#xff1a; https://learnopengl.com/Getting-started/Textures 纹理环绕 纹理环绕&#xff08;Texture Wrapping&#xff09;的作用是定义在纹理坐标超出标准范围时系统如何…...

Centos 7 安装yum(针对python卸载yum出错)

提前下载所需安装包&#xff0c;按照下面顺序安装即可完成&#xff0c;每个依赖包必须正确安装 下载地址&#xff1a;http://mirrors.163.com/centos/7/os/x86_64/Packages/ rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps ##强制删除已安装程序及其关联 whereis …...

substr()与substring()的区别

在 JavaScript 编程语言中&#xff0c;substr() 和 substring() 都是字符串函数&#xff0c;用于截取指定位置的子字符串。虽然这两个函数都可以用于截取字符串&#xff0c;但它们之间存在一些区别。 substr() 语法&#xff1a;string.substr(start,length) 参数值&#xff1a…...

MacOS 成为恶意软件活动的目标

Malwarebytes 警告称&#xff0c;一个针对 Mac 操作系统 (OS) 的数据窃取程序正在通过虚假的网络浏览器更新分发给毫无戒心的目标。 Atomic Stealer&#xff0c;也称为 AMOS&#xff0c;是 Mac OS 上流行的窃取程序。 Atomic Stealer (AMOS) 恶意软件最近被发现使用“ClearFa…...

从0开始学习JavaScript--JavaScript生成器

JavaScript生成器&#xff08;Generator&#xff09;是一项强大的语言特性&#xff0c;它允许函数在执行过程中被暂停和恢复&#xff0c;从而实现更灵活的控制流。本文将深入探讨JavaScript生成器的基本概念、用法&#xff0c;并通过丰富的示例代码展示其在实际应用中的优势和强…...

基于MCP协议实现AI与Notion自动化集成:原理、部署与实战

1. 项目概述&#xff1a;当Notion遇上AI&#xff0c;一个工具如何打通你的知识工作流 如果你和我一样&#xff0c;每天的工作都离不开Notion&#xff0c;用它来管理项目、记录灵感、整理文档&#xff0c;那你一定也想过&#xff1a;要是能让AI助手&#xff08;比如Claude、Cur…...

多模态大语言模型的视觉整合机制与H-散度应用

1. 多模态大语言模型的视觉整合机制解析当我们观察人类处理多模态信息的过程时&#xff0c;视觉和语言信号在大脑中是分层整合的——初级视觉皮层先提取边缘特征&#xff0c;而后与语言中枢协同形成高级语义理解。类似地&#xff0c;多模态大语言模型&#xff08;LVLM&#xff…...

如何高效开启ZTE光猫工厂模式:专业网络运维的完整实战指南

如何高效开启ZTE光猫工厂模式&#xff1a;专业网络运维的完整实战指南 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 在ZTE光猫网络管理领域&#xff0c;zteOnu工具是一款颠覆性的命令…...

大模型微调工程实践2026:从SFT到DPO的完整技术路线图

引言&#xff1a;微调不是万能药&#xff0c;但很多时候不可缺少 “我们能不能直接用 Prompt Engineering 代替微调&#xff1f;”——这是 2026 年企业 AI 团队最常问的问题之一。答案是&#xff1a;在很多场景下可以&#xff0c;但有几类问题 Prompt 搞不定&#xff1a;1. 输…...

从Meta DINOv2的‘最后一层’说起:深入理解视觉Transformer特征提取与相似度计算的‘为什么’

从Meta DINOv2的“最后一层”说起&#xff1a;深入理解视觉Transformer特征提取与相似度计算的“为什么” 当你第一次使用DINOv2计算两张图片的相似度时&#xff0c;可能会惊讶于它的准确性——即使是不同角度拍摄的同一物体&#xff0c;或是风格迥异的同类物品&#xff0c;模型…...

手把手教你用FM33LE026的接收超时功能实现串口DMA不定长接收

复旦微FM33LE0x单片机串口DMA接收超时实战指南 引言 在嵌入式开发中&#xff0c;串口通信是最基础也最常用的外设之一。面对不定长数据接收这一常见需求&#xff0c;许多开发者习惯依赖串口空闲中断配合DMA的方案。然而&#xff0c;当使用复旦微FM33LE0x系列单片机时&#xff0…...

SAP ABAP Dialog程序里Tabstrip分页签的完整配置流程(含PBO/PAI执行顺序详解)

SAP ABAP Dialog程序中Tabstrip分页签的深度配置与执行逻辑解析 在SAP ABAP Dialog程序开发中&#xff0c;Tabstrip分页签控件是实现复杂表单界面的核心组件之一。对于需要处理多步骤业务流程或展示大量关联数据的场景&#xff0c;合理配置Tabstrip不仅能提升用户体验&#xff…...

小红书发AI写的种草笔记被限流?去i迹把朱雀AIGC检测值降到0实测!

自媒体创作者用 AI 写内容遇到的现实问题——发到小红书/抖音/公众号被平台判定为 AI 内容&#xff0c;流量直接被压制。 去i迹 是这个场景下的首选工具——实测处理后内容朱雀 AIGC 检测值可以做到 0。这个数字看起来夸张但有真实技术支撑。这篇文章从朱雀检测值 0 的实测案例…...

Flink快照保留多久、多少个,设置参数

Flink 快照&#xff08;Checkpoint&#xff09;保留数量、保留时间 全套参数 配置我给你最完整、最准确、面试 生产都能用的版本&#xff0c;直接复制即可。一、核心结论&#xff08;先记这 3 个参数&#xff09;Flink 控制 快照保留多少个、保留多久&#xff0c;就靠这 3 个…...

架构实战:如何基于 GB28181 与异构计算构建跨平台(X86/ARM)AI 视频管理系统?源码交付深度解析

引言&#xff1a;安防开发的“深水区” 在过去的十年里&#xff0c;我见证了安防系统从简单的模拟监控到全数字化、智能化的转型。然而&#xff0c;对于大多数集成商和企业开发者而言&#xff0c;视频中台的开发依然是一场噩梦&#xff1a; 硬件兼容性陷阱&#xff1a;X86 架构…...