【c#】Quartz开源任务调度框架学习及练习Demo

Quartz开源任务调度框架学习及练习Demo

1、定义、作用

2、原理

3、使用步骤

4、使用场景

5、Demo代码参考示例

6、注意事项

7、一些Trigger属性说明

1、定义、作用

Quartz是一个开源的任务调度框架,作用是支持开发人员可以定时处理业务,比如定时发布邮件等定时操作。

2、原理

Quartz大致可以分为四部分,但是按功能分的话三部分就可以:schedule(调度器是schedule的一个调度单元)、job(任务)、Trigger(触发器)

scedule功能:统筹任务调度,
JOB:实现具体的任务
Trigger:设置触发任务的条件,比如定时

在这里插入图片描述

3、使用步骤

1、在项目NUGET包管理器中安装并添加Quartz引用
2、创建JOB任务类,继承并实现Ijob接口,在接口Execute方法中写具体任务
3、创建Schedule调度器
4、创建作业JOB,设置作业名称,将作业注册到调度器中
5、创建触发器trigger对象,设置触发器名称,触发时机,将触发器注册到调度器中
6、启动调度器,开始作业
7、调度器根据触发器设置,决定何时执行作业
8、执行作业execute方法,执行具体作业逻辑
9、调度器根据触发器设置,决定下一次执行作业时间
10、重复执行8、9直到结束

4、使用场景

执行定时任务

5、Demo代码参考示例

JOB任务类:

using Quartz;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DesignTimerService
{
    public class TestJob : IJob
    {
        string content = null;
        public async Task Execute(IJobExecutionContext context)
        {
            await Task.Run(() =>
            {
            	//这里写任务的具体业务逻辑
                content = "现在是北京时间:" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");

                WriteLog();
            });


        }

        public string WriteLog()
        {
            string path = @"C:\Users\KK\Desktop\log.txt";
           
            //
            if (!File.Exists(path))
            {
                FileStream fs = File.Create(path);
                fs.Close();

            }
            else
            {
                StreamWriter writer = new StreamWriter(path, true, Encoding.Default);
                writer.WriteLine(content);
                writer.Flush();
                writer.Close();
                
            }
            return content;
        }

    }
}

任务调度类:

using DesignTimerService;
using Quartz;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace JOB1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //创建调度单元
            Task<IScheduler> tsk = Quartz.Impl.StdSchedulerFactory.GetDefaultScheduler();
            IScheduler scheduler = tsk.Result;
            //创建具体的作业,具体的job需要单独在一个执行文件中执行
            IJobDetail Job = JobBuilder.Create<TestJob>().WithIdentity("奇偶比JOB1").Build();
            //IJobDetail Job2 = JobBuilder.Create<TestJob>().WithIdentity("奇偶比JOB2").Build();
            //创建并配置一个触发器
            ITrigger _ctroTrigger = TriggerBuilder.Create().WithIdentity("定时奇偶比1").StartNow().Build() as ITrigger;
            //将job和trigger加入到作业调度中
            scheduler.ScheduleJob(Job, _ctroTrigger);
            //开启调度
            scheduler.Start();

          
        }

        private void btn_display_Click(object sender, EventArgs e)
        {
            string path = @"C:\Users\KK\\Desktop\log.xls";

            if (!File.Exists(path))
            {
                string path1 = @"C:\Users\KK\\Desktop\log.txt";
                StreamReader reader = new StreamReader(path1);
                string content = reader.ReadToEnd();
                tb_content.Text = content;

            }
            else
            {
                StreamReader reader = new StreamReader(path);
                string content = reader.ReadToEnd();
                tb_content.Text = content;
            }
        }
    }
}

6、最终效果

在这里插入图片描述

7、一些Trigger属性说明

1.WithSimpleSchedule: 指定从某一个时间开始,以一定的时间间隔(单位是毫秒)执行的任务。

.WithSimpleSchedule(t => {
      t.RepeatForever();//重复次数不限
      //上下两者取其一
      t.WithRepeatCount(5);//设置重复次数,例如5次
      t.WithIntervalInHours(1);//设置执行间隔
      //上下两者取其一
      t.WithInterval(new TimeSpan(1, 2, 10));//设置重复间隔,用具体的小时,分钟,秒
 })

2.WithCalendarIntervalSchedule:
和WithSimpleSchedule类似,不同的是.SimpleSchedule指定的重复间隔只有(时,分,秒)而CalendarIntervalSchedule可以时(年,月,周,天,时,分,秒)

.WithCalendarIntervalSchedule(t => {
      t.WithIntervalInDays(1);//间隔以天为单位
      t.WithIntervalInWeeks(1);//间隔以周为单位
      t.WithIntervalInMonths(1);//间隔以月为单位
      t.WithIntervalInYears(1);//间隔以年为单位
})

3.WithDailyTimeIntervalSchedule: 指定每天的某个时间段内,以一定的时间间隔执行任务。并且它可以支持指定星期

.WithDailyTimeIntervalSchedule(t => {
      t.OnEveryDay();//每天执行
      t.OnDaysOfTheWeek(DayOfWeek.Monday,DayOfWeek.Saturday);//每周的星期几执行
      t.OnMondayThroughFriday();//设置工作日执行(周一至周五)
      t.OnSaturdayAndSunday();//设置周末执行
      t.StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(0,30));//设置执行的开始时间
      //只设置开始时间,会在开始以后一直执行
      t.EndingDailyAt(TimeOfDay.HourAndMinuteOfDay(1, 0));//设置停止执行的时间
      //二者表示,开某个时间段执行
      t.WithIntervalInHours(2);//设置重复间隔(更据方法不同可是时,分,秒)
      t.WithRepeatCount(10);//设置总共执行次数
})

4.StartNow()和.StartAt(new DateTimeOffset(new DateTime(2018,1,10))):

StartNow:表示启动后立即执行一次.
StartAt:表示启动后在指定日期或时间开始执行

5.WithCronTrigger:

以表达的形式定义触发条件
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C# Quartz是一个强大、开源、轻量的作业调度框架,可以用于定时执行任务。具体而言,你可以将要定时执行的任务代码写到实现了IJob接口的Execute方法中,当时间到达后,任务会自动执行。 以下是创建和执行C# Quartz定时任务的步骤: 1. 创建一个调度单元,可以使用StdSchedulerFactory类的GetDefaultScheduler方法来获取默认调度器。 2. 创建一个具体的作业(job),这个作业需要实现IJob接口,并且将任务代码写在其Execute方法中。 3. 创建并配置一个触发器(trigger),定义任务的执行时间。可以使用TriggerBuilder类的Create方法来创建触发器,并使用WithCronSchedule方法来指定任务的执行时间表达式。 4. 将作业和触发器加入到作业调度池中,使用调度器的ScheduleJob方法。 5. 开启调度器,使用调度器的Start方法。 下面是一个示例代码,展示了如何使用C# Quartz进行定时任务的创建和执行: ```csharp public class ScheduleManage { public static void Show() { // 创建调度单元 Task<IScheduler> tsk = StdSchedulerFactory.GetDefaultScheduler(); IScheduler scheduler = tsk.Result; // 创建一个具体的作业 IJobDetail job = JobBuilder.Create<SendMessageJob>() .WithIdentity("完成") .Build(); // 创建并配置一个触发器 ITrigger _CronTrigger = TriggerBuilder.Create() .WithIdentity("定时确认") .WithCronSchedule("0/2 * * * * ?") // 每2秒执行一次 .Build() as ITrigger; // 将作业和触发器加入到作业调度池中 scheduler.ScheduleJob(job, _CronTrigger); // 开启调度 scheduler.Start(); Console.ReadLine(); } } ``` 请注意,以上代码仅为示例,实际使用时需要根据具体需求进行修改。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值