Web开发:通过Quatz开启定时任务调度的基础demo

一、demo程序

【需求】实现每10分钟输出当前时间到txt文档

cs 复制代码
using Quartz;
using Quartz.Impl;
using System;
using System.IO;
using System.Threading.Tasks;

namespace QuartzDemo
{
    class Program
    {
        static async Task Main(string[] args)
        {
            // 创建一个调度程序实例
            IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler();
            await scheduler.Start();

            // 定义作业和将作业添加到调度程序
            IJobDetail job = JobBuilder.Create<WriteTimeJob>()//【设置一个作业WriteTimeJob】
                .WithIdentity("writeTimeJob", "group1")// 设置作业的标识符,name 为 "writeTimeJob"(唯一标识作业),group 为 "group1"
                .Build();

            // 创建一个触发器,每 10 分钟触发一次
            ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("writeTimeTrigger", "group1")// 设置触发器的标识符,name 为 "writeTimeTrigger"(唯一标识触发器),group 为 "group1"
                .StartNow()// 触发器立即开始
                .WithSimpleSchedule(x => x
                    .WithIntervalInMinutes(10)// 间隔10分钟
                    .RepeatForever())// 一直重复执行
                .Build();
            //WithCronSchedule("0 0/5 8-18 * * ?") // Cron表达式,表示每天8:00到18:00,每5分钟执行一次

            // 将作业和触发器添加到调度程序
            await scheduler.ScheduleJob(job, trigger);


            // 阻止主线程退出
            Console.WriteLine("Press any key to close the application...");
            Console.ReadKey();

            // 停止调度程序
            await scheduler.Shutdown();
        }
    }

    public class WriteTimeJob : IJob
    {
        public Task Execute(IJobExecutionContext context)
        {
            string filePath = "current_time.txt";//输出位置.\QuaztDemo\bin\Debug\net6.0
            string currentTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

            // 将当前时间写入文件
            File.AppendAllText(filePath, currentTime + Environment.NewLine);
            Console.WriteLine($"Time written to {filePath}: {currentTime}");

            return Task.CompletedTask;
        }
    }
}

二、Cron表达式

例如表达式:

bash 复制代码
"0 0/5 8-18 * * ?"

**表达的是:**在每天从早上8点到晚上6点(包括6点),每5分钟在每小时的第0秒触发一次。例如,触发时间点包括8:00、8:05、8:10、...、18:00。

bash 复制代码
秒 (秒) | 分 (分) | 小时 (时) | 日 (日) | 月 (月) | 星期 (星期) | 年 (年) (可选)

解析 "0 0/5 8-18 * * ?"

  1. 秒 (0):

    • 0 表示每分钟的第0秒触发。
  2. 分 (0/5):

    • 0/5 表示每小时的第0、5、10、15、20、25、30、35、40、45、50、55分钟触发,即每5分钟触发一次。
  3. 小时 (8-18):

    • 8-18 表示每天从8点到18点(包含18点)之间的每个小时触发。
  4. 日 (*):

    • * 表示每一天,即不限制具体的日期。
  5. 月 (*):

    • * 表示每个月,即不限制具体的月份。
  6. 星期 (?):

    • ? 表示不指定星期几。?* 都可以用来表示"不指定",但在某些情况下,? 用于表示不关注这一字段的具体值。

【举例】

五个常见的Cron表达式及其解释:

  1. **每小时的第15分钟触发一次**
  • 表达式: `0 15 * * * ?`

  • 解释: 每小时的第15分钟,即 00:15、01:15、02:15 等。

  1. **每天午夜12点执行**
  • 表达式: `0 0 0 * * ?`

  • 解释: 每天午夜12点,即00:00。

  1. **每周一早上8点执行**
  • 表达式: `0 0 8 ? * MON`

  • 解释: 每周一早上8点。

  1. **每月1号凌晨1点执行**
  • 表达式: `0 0 1 1/1 ? *`

  • 解释: 每月1号凌晨1点,即01:00。

  1. **每分钟执行一次**
  • 表达式: `0 * * * * ?`

  • 解释: 每分钟的第0秒执行,即每分钟一次。

相关推荐
木子欢儿30 分钟前
Intel 架构的 MacBook Pro 运行 Linux 发热量高解决
linux·运维·服务器
凌虚30 分钟前
面向 MySQL 用户的 PostgreSQL 快速上手指南
数据库·后端·架构
五阿哥永琪39 分钟前
MySQL中操作json的函数!
数据库·mysql·json
来者皆善44 分钟前
了解Mysql优化吗?如何优化索引?
数据库·mysql
都叫我大帅哥1 小时前
Java JJWT 完全指南:从入门到生产级实践
java
前端开发张小七2 小时前
Java 学习笔记 · 第一课:基础语法与核心概念
java·后端
ThsPool3 小时前
【ENVI二次开发学习整理 04】ENVI功能扩展与二次开发
java·前端·javascript
赤壁小虾3 小时前
【渲染流水线】[逐片元阶段]-[透明度测试]以UnityURP为例
java·前端·数据库
清水迎朝阳3 小时前
客户端软件 — 用户统计方案
服务器·c++·客户端·用户统计
MC皮蛋侠客3 小时前
SQLAlchemy 系列(七):高级建模与高效写入——批量 DML、方言与扩展
数据库·python