一. 安装nuget包
环境 : .net 6.0 ,vs2022
二. IOCJobFactory
定义了一个名为 IOCJobFactory 的类,它实现了 IJobFactory 接口。这个类的主要作用是使用依赖注入来创建和管理 Quartz 作业实例
在这里插入public class IOCJobFactory : IJobFactory
{
private readonly IServiceProvider _serviceProvider;
public IOCJobFactory(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
//尝试从依赖注入容器中获取与作业类型匹配的服务。如果找到匹配的服务,那么该服务会被作为 IJob 返回
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();
}
}
代码片
三. QuartzFactory
这个QuartzFactory类的主要作用是创建一个Quartz调度器,并将一个作业和相应的触发器绑定到该调度器上。这样,当触发器满足其Cron表达式时,对应的作业就会被调度并执行。
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<string> Start()
{
//2、通过调度工厂获得调度器
_scheduler = await _schedulerFactory.GetScheduler();
//这里是指定容器仓库
_scheduler.JobFactory = _IOCjobFactory;
//3、开启调度器
await _scheduler.Start();
//4、创建一个触发器
var trigger = TriggerBuilder.Create()
.WithCronSchedule("0 55-58/1 13 * * ?") // 每天的 13:50 开始触发
// .WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever()) // 每5秒执行一次
// .WithSimpleSchedule(x => x.WithIntervalInSeconds(2).RepeatForever())//每两秒执行一次
.Build();
//5、创建任务
var jobDetail = JobBuilder.Create<TestJob>()
.WithIdentity("job", "group")
.Build();
//6、将触发器和任务器绑定到调度器中
await _scheduler.ScheduleJob(jobDetail, trigger);
return await Task.FromResult("将触发器和任务器绑定到调度器中完成");
}
}
四 .TestJob
具体定时执行的逻辑代码
public class TestJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{//定时job的执行内容
await Task.Run(() => {
Console.WriteLine($"{DateTime.Now} Hello World!!");
});
}
}
五. 启动类注入
builder.Services.AddSingleton<ISchedulerFactory, StdSchedulerFactory>();
builder.Services.AddSingleton<QuartzFactory>();
builder.Services.AddSingleton<TestJob>();
builder.Services.AddSingleton<IJobFactory, IOCJobFactory>();
var app = builder.Build();
//这里也可以加入是否启动 Quartz是否启动
if (true)
{
//获取容器中的QuartzFactory
var quartz = app.Services.GetRequiredService<QuartzFactory>();
app.Lifetime.ApplicationStarted.Register(async () =>
{
await quartz.Start();
});
app.Lifetime.ApplicationStopped.Register(() =>
{
//Quzrtz关闭方法
//quartz.Stop();
});
}
代码 :