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秒执行,即每分钟一次。

相关推荐
带娃的IT创业者2 小时前
Python 异步编程完全指南:从入门到精通
服务器·开发语言·python·最佳实践·asyncio·异步编程
zzb15804 小时前
RAG from Scratch-优化-query
java·数据库·人工智能·后端·spring·mybatis
一只鹿鹿鹿4 小时前
信息安全等级保护安全建设防护解决方案(总体资料)
运维·开发语言·数据库·面试·职场和发展
堕2744 小时前
MySQL数据库《基础篇--数据库索引(2)》
数据库·mysql
wei_shuo4 小时前
数据库优化器进化论:金仓如何用智能下推把查询时间从秒级打到毫秒级
数据库·kingbase·金仓
wuqingshun3141594 小时前
如何停止一个正在退出的线程
java·开发语言·jvm
雷工笔记5 小时前
Navicat Premium 17 软件安装记录
数据库
wenlonglanying5 小时前
Ubuntu 系统下安装 Nginx
数据库·nginx·ubuntu
数据库小组5 小时前
10 分钟搞定!Docker 一键部署 NineData 社区版
数据库·docker·容器·database·数据库管理工具·ninedata·迁移工具
Barkamin5 小时前
队列的实现(Java)
java·开发语言