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

相关推荐
曹牧14 分钟前
Oracle:快速定位最新数据
数据库·oracle
MindUp24 分钟前
企业网盘权限模型解析:多层级访问控制与审计能力选型指南
java·linux·运维
NG47733 分钟前
【软件设计与体系结构】-策略设计模式
java·设计模式·软件工程
Zhu75841 分钟前
在Docker环境部署ApacheGuacamole,对接PG数据库
数据库·docker·容器
pt10431 小时前
思科网络自动化-API常用数据编码格式(JSON/XML/YAML)课程与实践
linux·服务器·网络
程序员天天困1 小时前
优雅记录操作日志:从注解到 SpEL 的全链路实践与开源方案对比
java·后端
Leighteen1 小时前
Redis与MySQL双写一致性:从问题根源到工程落地
数据库·redis·mysql
战血石LoveYY1 小时前
Integer类型超限,导致数据异常
java·算法
ZXXstarstar2 小时前
2026年电池安全使用年限的量化决策:什么时间到期最需要替换?
linux·运维·服务器·电池