
首先创建 NetCore Web 应用(框架选择NET6.0)
首先引入Nuget包 Quartz
首先注入调度工厂
//注册服务 builder.Services.AddSingleton();
创建一个IOC服务类为了能够让我们访问到 注入容器中的其他注入信息,因为Quartz有一个默认的生成job的工厂类Quartz.Simpl.SimpleJobFactory
using Quartz;
using Quartz.Spi;
namespace QuzrtzJob.Factory
{
public class IOCJobFactory : IJobFactory
{
private readonly IServiceProvider _serviceProvider;
public IOCJobFactory(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
{
return _serviceProvider.GetService(bundle.JobDetail.JobType) as IJob;
}
public void ReturnJob(IJob job)
{
var disposable = job as IDisposable;
disposable?.Dispose();
}
}
}
完成这一步之后创建一个启动Quartz服务的服务类(这里我就写了个启动方法,按道理来说应该会有一个关闭方法)
using Quartz;
using Quartz.Spi;
namespace QuzrtzJob.Factory
{
public class QuartzFactory
{
//1、声明一个调度工厂
private ISchedulerFactory _schedulerFactory;
private IScheduler _scheduler=default;
private IJobFactory _IOCjobFactory;
public QuartzFactory(ISchedulerFactory schedulerFactory,IJobFactory jobFactory) {
_schedulerFactory = schedulerFactory;
_IOCjobFactory = jobFactory;
}
public async Task Start()
{
//2、通过调度工厂获得调度器
_scheduler = await _schedulerFactory.GetScheduler();
//这里是指定容器仓库
_scheduler.JobFactory = _IOCjobFactory;
//3、开启调度器
await _scheduler.Start();
//4、创建一个触发器
var trigger = TriggerBuilder.Create()
.WithSimpleSchedule(x => x.WithIntervalInSeconds(2).RepeatForever())//每两秒执行一次
.Build();
//5、创建任务
var jobDetail = JobBuilder.Create()
.WithIdentity("job", "group")
.Build();
//6、将触发器和任务器绑定到调度器中
await _scheduler.ScheduleJob(jobDetail, trigger);
return await Task.FromResult("将触发器和任务器绑定到调度器中完成");
}
}
}
这个时候就应该创建自己的任务类了
该类必须继承IJob实现接口
Execute方法为调度方法每次执行也是执行这个方法
创建完成之后 让我们在返回 Program.cs 中 把刚才创建的 类都注入到 容器中
builder.Services.AddSingleton(); builder.Services.AddSingleton (); builder.Services.AddSingleton ();
准备完毕、在启动应用的时候调用 服务类中的启动方法 Start (在Program.cs)
//这里也可以加入是否启动 Quartz是否启动
if (true)
{
//获取容器中的QuartzFactory
var quartz = app.Services.GetRequiredService();
app.Lifetime.ApplicationStarted.Register(async () =>
{
await quartz.Start();
});
app.Lifetime.ApplicationStopped.Register(() =>
{
//Quzrtz关闭方法
//quartz.Stop();
});
}
运行,不出意外的话就会执行 Execute方法 这里设置的两秒执行一次
如何更改执行时间呢,在Strat方法中可以使用
//这是2秒
.WithSimpleSchedule(x => x.WithIntervalInSeconds(2).RepeatForever())//每两秒执行一次
//也可以使用 Cron表达式
.WithCronSchedule("0/20 0/30 2,4 2-5 8 ?")
网上百度一搜索 Cron表达式生成器就有基本可以涵盖所有场景
参考 https://blog.csdn.net/qq_32688731/article/details/100773434