一、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.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表达式
例如表达式:
"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秒执行,即每分钟一次。