一、demo程序
【需求】实现每10分钟输出当前时间到txt文档
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.0string 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表达式
例如表达式:
"0 0/5 8-18 * * ?"
表达的是:在每天从早上8点到晚上6点(包括6点),每5分钟在每小时的第0秒触发一次。例如,触发时间点包括8:00、8:05、8:10、...、18:00。
秒 (秒) | 分 (分) | 小时 (时) | 日 (日) | 月 (月) | 星期 (星期) | 年 (年) (可选)
解析
"0 0/5 8-18 * * ?"
秒 (0):
0
表示每分钟的第0秒触发。分 (0/5):
0/5
表示每小时的第0、5、10、15、20、25、30、35、40、45、50、55分钟触发,即每5分钟触发一次。小时 (8-18):
8-18
表示每天从8点到18点(包含18点)之间的每个小时触发。日 (*):
*
表示每一天,即不限制具体的日期。月 (*):
*
表示每个月,即不限制具体的月份。星期 (?):
?
表示不指定星期几。?
和*
都可以用来表示“不指定”,但在某些情况下,?
用于表示不关注这一字段的具体值。
【举例】
五个常见的Cron表达式及其解释:
1. **每小时的第15分钟触发一次**
- 表达式: `0 15 * * * ?`
- 解释: 每小时的第15分钟,即 00:15、01:15、02:15 等。2. **每天午夜12点执行**
- 表达式: `0 0 0 * * ?`
- 解释: 每天午夜12点,即00:00。3. **每周一早上8点执行**
- 表达式: `0 0 8 ? * MON`
- 解释: 每周一早上8点。4. **每月1号凌晨1点执行**
- 表达式: `0 0 1 1/1 ? *`
- 解释: 每月1号凌晨1点,即01:00。5. **每分钟执行一次**
- 表达式: `0 * * * * ?`
- 解释: 每分钟的第0秒执行,即每分钟一次。