Quartz.net 定时任务
官网
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是
SimpleTrigger (实现ISimpleTrigger接口)包含常用的方法,常用的定时任务大都可以实现
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
}
}