C# Quartz.net 定时任务

发布于:2025-06-23 ⋅ 阅读:(16) ⋅ 点赞:(0)

官网

https://www.quartz-scheduler.net/documentation/quartz-3.x/how-tos/one-off-job.html

安装

install-package quartz

主要成员

Job

Job是具体的业务逻辑所在,是定时任务中要执行的那一项任务

Trigger

Trigger触发器,规定了定时任务的执行时间、频率、次数

eduler

Scheduler调度器将Job和Trigger关联起来,负责整个定时任务的开启、关闭

示例:

class Program
    {
        public static async Task Main(string[] args)
        {
            ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
            IScheduler scheduler=await schedulerFactory.GetScheduler();//创建scheduler
            await scheduler.Start();//启动scheduler
 
            IJobDetail job = JobBuilder.Create<TestJob>()
                .WithIdentity("testJob", "testGroup")
                .Build();//创建job(jobdetail)
 
            ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("testTrigger", "testGroup")
                .StartNow()
                .WithSimpleSchedule(x=>x.WithIntervalInSeconds(10).RepeatForever())
                .Build();//创建trigger 现在开始 每10秒执行一次  无限重复
 
            await scheduler.ScheduleJob(job, trigger);//scheduler关联trigger和job
            Console.ReadLine();
        }
    }
 
    public class TestJob : IJob
    {
        public async Task Execute(IJobExecutionContext context)
        {//定时job的执行内容
            await Task.Run(()=>{ 
                Debug.WriteLine("testJob");
            });
        }
    }

Scheduler简介

官方提供了实现类StdSchedulerFactory

实例化一个Scheduler以后,Scheduler可以:

Start:开始定时任务,定时触发任务执行

待机:暂停,触发器也不会启动

Shutdown:停止调度器,不会在定时触发执行任务

框架核心接口

  • IScheduler 操作Scheduler的核心api。
  • IJob 业务逻辑所在地!要实现接口的Excute方法。
  • IJobDetail 用来实例化Job的!
  • ITrigger 一个job可以对应多个trigger,但是一个trigger只能对应一个job!所有trigger都实现该接口。
  • JobBuilder 用来创建JobDetail实例(JobDetail再创建Job实例)。
  • TriggerBuilder 用来创建Trigger实例。而且我们可以看到示例代码中的方法级联(流式接口)。
  • SchedulerBuilder 用来创建Scheduler实例。

Job

定时任务只需要继承IJob就可以了,然后必须要实现Execute方法

public class TestJob : IJob
    {
        public async Task Execute(IJobExecutionContext context)
        {
            await Task.Run(()=>{ 
                Debug.WriteLine("testJob");
            });
        }
    }

Trigger

Trigger可以包含JobDataMap参数,最常用的Trigger是

  1. SimpleTrigger (实现ISimpleTrigger接口)包含常用的方法,常用的定时任务大都可以实现

  2. CronTrigger (实现ICronTrigger接口) 主要是可以使用Cron表达式,来实现复杂的触发方式(当然简单的也可以)

JobDataMap

IJobDetail有一个JobDataMap属性,可以用来往Job里面传参。

设置参数:IJobDetail的UsingJobData

获取参数:IJobExecutionContext的JobDetail.JobDataMap属性的GetString(GetInt等等)方法

示例代码如下:

 class Program
    {
        public static async Task Main(string[] args)
        {
            ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
            IScheduler scheduler=await schedulerFactory.GetScheduler();
            await scheduler.Start();
 
            IJobDetail job = JobBuilder.Create<TestJob>()
                .WithIdentity("testJob", "testGroup")
                .UsingJobData("stringParam","hello job")
                .UsingJobData("numberParam",2020)
                .Build();
 
            ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("testTrigger", "testGroup")
                .StartNow()
                .WithSimpleSchedule(x=>x.WithIntervalInSeconds(10).RepeatForever())
                .Build();
 
            await scheduler.ScheduleJob(job, trigger);
            Console.ReadLine();
        }
    }
 
    public class TestJob : IJob
    {
        public async Task Execute(IJobExecutionContext context)
        {
            JobDataMap jobParam= context.JobDetail.JobDataMap;
            string paramStr= jobParam.GetString("stringParam");
            int paramNo = jobParam.GetInt("numberParam");
            await Console.Out.WriteLineAsync("paramStr=" + paramStr + ",paramNo=" + paramNo);
        }
    }

Trigger

Trigger也可以使用UsingJobData,使用场景是:

多个Trigger来触发同一个Job,不同的Trigger需要传不同的参数

示例代码如下
class Program
    {
        public static async Task Main(string[] args)
        {
            ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
            IScheduler scheduler=await schedulerFactory.GetScheduler();
            await scheduler.Start();
 
            IJobDetail job = JobBuilder.Create<TestJob>()
                .WithIdentity("testJob", "testGroup")
                .Build();
 
            ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("testTrigger", "testGroup")
                .UsingJobData("stringParam", "hello trigger")
                .UsingJobData("numberParam", 2021)
                .StartNow()
                .WithSimpleSchedule(x=>x.WithIntervalInSeconds(10).RepeatForever())
                .Build();
 
            await scheduler.ScheduleJob(job, trigger);
            Console.ReadLine();
        }
    }
 
    public class TestJob : IJob
    {
        public async Task Execute(IJobExecutionContext context)
        {
            JobKey key = context.JobDetail.Key;//测试获取JobDetail的JobKey(JobBuilder设置的)
            JobDataMap jobParam = context.MergedJobDataMap;//获取Trigger设置的JobDataMap
            string paramStr= jobParam.GetString("stringParam");
            int paramNo = jobParam.GetInt("numberParam");
            await Console.Out.WriteLineAsync("key="+key+",paramStr=" + paramStr + ",paramNo=" + paramNo);
            //key=testGroup.testJob,paramStr=hello trigger,paramNo=2021
        }
    }


网站公告

今日签到

点亮在社区的每一天
去签到