【c#】Quartz开源任务调度框架学习及练习Demo

Quartz开源任务调度框架学习及练习Demo

1、定义、作用

2、原理

3、使用步骤

4、使用场景

5、Demo代码参考示例

6、注意事项

7、一些Trigger属性说明

1、定义、作用

Quartz是一个开源的任务调度框架,作用是支持开发人员可以定时处理业务,比如定时发布邮件等定时操作。

2、原理

Quartz大致可以分为四部分,但是按功能分的话三部分就可以:schedule(调取器是schedule的一个调度单元)、job(任务)、Trigger(触发器)

scedule功能:统筹任务调度,
JOB:实现具体的任务
Trigger:设置触发任务的条件,比如定时

在这里插入图片描述

3、使用步骤

1、在项目NUGET包管理器中安装并添加Quartz引用
2、创建JOB任务类,继承并实现Ijob接口,在接口Execute方法中写图集任务
3、创建Schedule调度器
4、创建作业JOB,设置作业名称,将作业注册到调度器中
5、创建触发器trigger对象,设置触发器名称,触发时机,将触发器注册到调度器中
6、启动调度器,开始作业
7、调度器根据触发器设置,决定何时执行作业
8、执行作业execute方法,执行具体作业逻辑
9、调度器根据触发器设置,决定下一次执行作业时间
10、重复执行8、9直到结束

4、使用场景

执行定时任务

5、Demo代码参考示例

JOB任务类:

using Quartz;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace DesignTimerService
{public class TestJob : IJob{string content = null;public async Task Execute(IJobExecutionContext context){await Task.Run(() =>{//这里写任务的具体业务逻辑content = "现在是北京时间:" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");WriteLog();});}public string WriteLog(){string path = @"C:\Users\KK\Desktop\log.txt";//if (!File.Exists(path)){FileStream fs = File.Create(path);fs.Close();}else{StreamWriter writer = new StreamWriter(path, true, Encoding.Default);writer.WriteLine(content);writer.Flush();writer.Close();}return content;}}
}

任务调度类:

using DesignTimerService;
using Quartz;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace JOB1
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){//创建调度单元Task<IScheduler> tsk = Quartz.Impl.StdSchedulerFactory.GetDefaultScheduler();IScheduler scheduler = tsk.Result;//创建具体的作业,具体的job需要单独在一个执行文件中执行IJobDetail Job = JobBuilder.Create<TestJob>().WithIdentity("奇偶比JOB1").Build();//IJobDetail Job2 = JobBuilder.Create<TestJob>().WithIdentity("奇偶比JOB2").Build();//创建并配置一个触发器ITrigger _ctroTrigger = TriggerBuilder.Create().WithIdentity("定时奇偶比1").StartNow().Build() as ITrigger;//将job和trigger加入到作业调度中scheduler.ScheduleJob(Job, _ctroTrigger);//开启调度scheduler.Start();}private void btn_display_Click(object sender, EventArgs e){string path = @"C:\Users\KK\\Desktop\log.xls";if (!File.Exists(path)){string path1 = @"C:\Users\KK\\Desktop\log.txt";StreamReader reader = new StreamReader(path1);string content = reader.ReadToEnd();tb_content.Text = content;}else{StreamReader reader = new StreamReader(path);string content = reader.ReadToEnd();tb_content.Text = content;}}}
}

6、最终效果

在这里插入图片描述

7、一些Trigger属性说明

1.WithSimpleSchedule: 指定从某一个时间开始,以一定的时间间隔(单位是毫秒)执行的任务。

.WithSimpleSchedule(t => {t.RepeatForever();//重复次数不限//上下两者取其一t.WithRepeatCount(5);//设置重复次数,例如5次t.WithIntervalInHours(1);//设置执行间隔//上下两者取其一t.WithInterval(new TimeSpan(1, 2, 10));//设置重复间隔,用具体的小时,分钟,秒})

2.WithCalendarIntervalSchedule:
和WithSimpleSchedule类似,不同的是.SimpleSchedule指定的重复间隔只有(时,分,秒)而CalendarIntervalSchedule可以时(年,月,周,天,时,分,秒)

.WithCalendarIntervalSchedule(t => {t.WithIntervalInDays(1);//间隔以天为单位t.WithIntervalInWeeks(1);//间隔以周为单位t.WithIntervalInMonths(1);//间隔以月为单位t.WithIntervalInYears(1);//间隔以年为单位
})

3.WithDailyTimeIntervalSchedule: 指定每天的某个时间段内,以一定的时间间隔执行任务。并且它可以支持指定星期

.WithDailyTimeIntervalSchedule(t => {t.OnEveryDay();//每天执行t.OnDaysOfTheWeek(DayOfWeek.Monday,DayOfWeek.Saturday);//每周的星期几执行t.OnMondayThroughFriday();//设置工作日执行(周一至周五)t.OnSaturdayAndSunday();//设置周末执行t.StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(0,30));//设置执行的开始时间//只设置开始时间,会在开始以后一直执行t.EndingDailyAt(TimeOfDay.HourAndMinuteOfDay(1, 0));//设置停止执行的时间//二者表示,开某个时间段执行t.WithIntervalInHours(2);//设置重复间隔(更据方法不同可是时,分,秒)t.WithRepeatCount(10);//设置总共执行次数
})

4.StartNow()和.StartAt(new DateTimeOffset(new DateTime(2018,1,10))):

StartNow:表示启动后立即执行一次.
StartAt:表示启动后在指定日期或时间开始执行

5.WithCronTrigger:

以表达的形式定义触发条件

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

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

相关文章

python实现TCPclient

python实现TCPclient是一件简单的事情&#xff0c;只要通过socket这个模块就可以实现。 一、实现步骤 1、导入模块&#xff1a; 首先&#xff0c;你需要导入Python的socket模块。 import socket2、创建Socket对象&#xff1a; 使用socket.socket()函数创建一个新的socket对…

Flink学习---15、FlinkCDC(CDC介绍、案例实操)

星光下的赶路人star的个人主页 未来总是藏在迷雾中让人胆怯&#xff0c;但当你踏入其中&#xff0c;便会云开雾散 文章目录 1、CDC简介1.1 什么是CDC1.2 CDC的种类1.3 Flink-CDC 2、FlinkCDC案例实操2.1 开启MySQL Binlog并重启MySQL2.2 FlinkSQL方式的应用2.2.1 导入依赖2.2.2…

【Java 进阶篇】HTML DOM 事件详解

当用户在网页上点击按钮、输入文本、鼠标移动到某个区域或执行其他互动操作时&#xff0c;这些动作都可以触发事件。HTML DOM&#xff08;文档对象模型&#xff09;允许我们使用JavaScript来捕获、处理和响应这些事件&#xff0c;以实现网页的交互和动态性。本篇博客将围绕HTML…

iOS原生、Android 原生, flutter 三种方式给照片流添加文字(水印)

效果图:三中代码实现的效果差不多 Swift:代码 import UIKitclass ImageWatermarking: NSObject {static func textToImage(drawText text: String, inImage initImage: UIImage, atPoint point: CGPoint) -> UIImage {let textColor = UIColor.whitelet textFont = UIFon…

DPDK收发包流程分析

一、 前言 DPDK是intel工程师开发的一款用来快速处理数据包的框架,最初的目的是为了证明传统网络数据包处理性能低不是intel处理器导致的,而是传统数据的处理流程导致,后来随着dpdk的开源及其生态的快速发展,dpdk成为了高性能网络数据处理的优秀框架。本篇文章主要介绍DPDK…

Django实现音乐网站 ⒇

使用Python Django框架做一个音乐网站&#xff0c; 本篇音乐播放器-添加播放音乐功能实现。 目录 创建播放器数据表 设置表结构 执行创建表 命令 执行 数据表结构 添加单个歌曲 创建路由 加入播放器视图 模板处理 基类方法 子页面调用 优化弹窗 加入layui文件 基…

在URP管线中添加ShaderMaterial自定义GUI的方法

编写GUI面板 1. 新建GUI子面板 using UnityEngine; using UnityEngine.Rendering;namespace UnityEditor.Rendering.Universal.ShaderGUI {internal class CP_XXXOutLineGUI{public static class Styles{}public struct LitProperties{public LitProperties(MaterialProperty…

vxe-table添加排序

在 <vxe-column> 中添加sortable属性 <vxe-columnfield"longitude"sortabletitle"经度"></vxe-column><vxe-columnfield"latitude"sortabletitle"纬度"></vxe-column><vxe-columnfield"dateEst…

Spring Boot如何优雅实现动态灵活可配置的高性能数据脱敏功能

1.背景 在当下互联网高速发展的时代下&#xff0c;涉及到用户的隐私数据安全越发重要&#xff0c;一旦泄露将造成不可估量的后果。所以现在的业务系统开发中都会对用户隐私数据加密之后存储落库&#xff0c;同时还要求后端返回数据给前台之前进行数据脱敏。所谓脱敏处理其实就…

TikTok Shop美国本土店VS跨境店,如何选择?有何区别?

TikTok不仅仅是一个用于分享有趣短视频的平台&#xff0c;它也逐渐成为了商家们极力推广自己品牌和产品的场所。 在TikTok的商业生态系统中&#xff0c;存在几种不同的商店类型&#xff0c;各有其独特性和适用场景。今天&#xff0c;我们就来深入探讨这些店的差异与特点。 一、…

Si24R2|2.4G单发射芯片 +7dBm可调功率 校讯通

Si24R2是一种通用、低功耗、高性能的2.4GHz无线射频发射芯片&#xff0c;主要用于单向通信系统&#xff0c;以降低系统成B&#xff0c;在运行中与si24r1兼容。 Si24r2具有低功耗和低成B。 它主要用于单向低功率传输系统&#xff0c;如无线控制系统、无线数据采集系统等。 Si2…

在mysql8查询中使用ORDER BY结合LIMIT时,分页查询时出现后一页的数据重复前一页的部分数据。

这里写目录标题 问题描述&#xff1a;问题模拟&#xff1a;原因分析问题解释问题解决验证官方文档支持 问题描述&#xff1a; 在mysql8查询中使用ORDER BY结合LIMIT时&#xff0c;分页查询时出现后一页的数据重复前一页的部分数据。 问题模拟&#xff1a; 表table_lock_test&…

Milvus 介绍

Milvus 介绍 Milvus 矢量数据库是什么&#xff1f;关键概念非结构化数据嵌入向量向量相似度搜索 为什么是 Milvus?支持哪些索引和指标&#xff1f;索引类型相似度指标(Similarity metrics) 应用示例Milvus 是如何设计的&#xff1f;开发者工具API访问Milvus 生态系统工具 本页…

《数据结构、算法与应用C++语言描述》使用C++语言实现数组双端队列

《数据结构、算法与应用C语言描述》使用C语言实现数组双端队列 定义 队列的定义 队列&#xff08;queue&#xff09;是一个线性表&#xff0c;其插入和删除操作分别在表的不同端进行。插入元素的那一端称为队尾&#xff08;back或rear&#xff09;&#xff0c;删除元素的那一…

【vue】el-carousel实现视频自动播放与自动切换到下一个视频功能:

文章目录 一、原因:二、实现代码:三、遇到的问题&#xff1a;【1】问题&#xff1a;el-carousel页面的视频不更新【2】问题&#xff1a;多按几次左按钮&#xff0c;其中跳过没有播放的视频没有销毁&#xff0c;造成再次自动播放时会跳页 一、原因: 由于后端无法实现将多条视频拼…

手机爬虫用Scrapy详细教程:构建高效的网络爬虫

如果你正在进行手机爬虫的工作&#xff0c;并且希望通过一个高效而灵活的框架来进行数据抓取&#xff0c;那么Scrapy将会是你的理想选择。Scrapy是一个强大的Python框架&#xff0c;专门用于构建网络爬虫。今天&#xff0c;我将与大家分享一份关于使用Scrapy进行手机爬虫的详细…

照片后期编辑工具Lightroom Classic 2024 mac中文新增功能

Lightroom Classic 2024&#xff08;lrC2024&#xff09;是专为摄影爱好者和专业摄影师设计的软件&#xff0c;它提供了全面的照片编辑工具&#xff0c;可以精准调整照片的色彩、对比度和曝光等参数&#xff0c;以便定制后期处理效果。 在lrC2024中&#xff0c;用户体验得到了提…

文件的逻辑结构(顺序文件,索引文件)

所谓的“逻辑结构”&#xff0c;就是指在用户看来&#xff0c;文件内部的数据应该是如何组织起来的。 而“物理结构”指的是在操作系统看来&#xff0c;文件的数据是如何存放在外存中的。 1.无结构文件 无结构文件:文件内部的数据就是一系列二进制流或字符流组成。无明显的逻…

SortedSet 和 List 异同点

SortedSet 在 Java 的整个集合体系中&#xff0c;集合可以分成两个体系&#xff0c;一个是 Collection 存储单个对象的集合&#xff0c;另一个是 k-v 结构的 Map 集合。 SortedSet 是 Collection 体系下 Set 接口下的派生类&#xff0c;而 Set 集合的特征是不包含重 复的元素的…

(论文翻译)UFO: Unified Feature Optimization——UFO:统一特性优化

作者&#xff1a; Teng Xi 论文总结&#xff1a;总结 Code: https://github.com/PaddlePaddle/VIMER/tree/main/UFO 摘要&#xff1a; 本文提出了一种新的统一特征优化(Unified Feature Optimization, UFO)范式&#xff0c;用于在现实世界和大规模场景下训练和部署深度模型…