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

相关推荐
程序员云帆哥11 小时前
MySQL JDBC Driver URL参数配置规范
数据库·mysql·jdbc
TDengine (老段)11 小时前
TDengine 数学函数 FLOOR 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
Olrookie12 小时前
若依前后端分离版学习笔记(二十)——实现滑块验证码(vue3)
java·前端·笔记·后端·学习·vue·ruoyi
大气层煮月亮12 小时前
Oracle EBS ERP开发——报表生成Excel标准模板设计
数据库·oracle·excel
云和数据.ChenGuang12 小时前
达梦数据库的命名空间
数据库·oracle
lpfasd12312 小时前
第2部分:Netty核心架构与原理解析
运维·服务器·架构
倚栏听风雨12 小时前
java.lang.SecurityException异常
java
若尘拂风13 小时前
centos 7.9 编译安装 freeswitch 1.10.12
服务器·udp·freeswitch·sip
星河队长13 小时前
VS创建C++动态库和C#访问过程
java·c++·c#
三三木木七13 小时前
mysql拒绝连接
数据库·mysql