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

相关推荐
言慢行善9 分钟前
sqlserver模糊查询问题
java·数据库·sqlserver
韶博雅12 分钟前
emcc24ai
开发语言·数据库·python
专吃海绵宝宝菠萝屋的派大星14 分钟前
使用Dify对接自己开发的mcp
java·服务器·前端
有想法的py工程师26 分钟前
PostgreSQL 分区表排序优化:Append Sort 优化为 Merge Append
大数据·数据库·postgresql
大数据新鸟33 分钟前
操作系统之虚拟内存
java·服务器·网络
Tong Z34 分钟前
常见的限流算法和实现原理
java·开发语言
凭君语未可37 分钟前
Java 中的实现类是什么
java·开发语言
He少年40 分钟前
【基础知识、Skill、Rules和MCP案例介绍】
java·前端·python
迷枫7121 小时前
达梦数据库的体系架构
数据库·oracle·架构
克里斯蒂亚诺更新1 小时前
myeclipse的pojie
java·ide·myeclipse