当前位置: 首页 > 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;并通过丰富的示例代码展示其在实际应用中的优势和强…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...