ASP.NET Core 任务调度----Quartz.NET

- Quartz.NET 任务调度

任务调度:Hangfire、Quartz.NET、FluentScheduler、Coravel、Quartzmin 可自由选择和学习



Quartz.NET具有三个主要概念:

job:运行的后台任务

trigger:控制后台任务运行的触发器。

scheduler:协调job和trigger


一、引入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

    public class Job_Blogs_Quartz : JobBase, IJob
    {
        private readonly IBlogArticleServices _blogArticleServices;

        public Job_Blogs_Quartz(IBlogArticleServices blogArticleServices, ITasksQzServices tasksQzServices, ITasksLogServices tasksLogServices)
            : base(tasksQzServices, tasksLogServices)
        {
            _blogArticleServices = blogArticleServices;
        }
        public async Task Execute(IJobExecutionContext context)
        {
            var executeLog = await ExecuteJob(context, async () => await Run(context));
        }
        public async Task Run(IJobExecutionContext context)
        {
            System.Console.WriteLine($"Job_Blogs_Quartz 执行 {DateTime.Now.ToShortTimeString()}");
            var list = await _blogArticleServices.Query();
            // 也可以通过数据库配置,获取传递过来的参数
            JobDataMap data = context.JobDetail.JobDataMap;
            //int jobId = data.GetInt("JobParam");
        }
    }

五、 Program.cs注入任务,也可以通过反射注入

builder.Services.AddSingleton();
builder.Services.AddSingleton();
builder.Services.AddSingleton();
或者自定义类反射注入
    //任务注入
    var baseType = typeof(IJob);
    var path = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory;
    var referencedAssemblies = System.IO.Directory.GetFiles(path, "Quartz.Tasks.Core.dll").Select(Assembly.LoadFrom).ToArray();
    var types = referencedAssemblies
        .SelectMany(a => a.DefinedTypes)
        .Select(type => type.AsType())
        .Where(x => x != baseType && baseType.IsAssignableFrom(x)).ToArray();
    var implementTypes = types.Where(x => x.IsClass).ToArray();
    foreach (var implementType in implementTypes)
    {
        services.AddTransient(implementType);
    }

6、创建启动类

    //获取容器中的QuartzFactory
    var quartz = app.Services.GetRequiredService();
    app.Lifetime.ApplicationStarted.Register(async () =>
    {
       await quartz.Start();
    });

    app.Lifetime.ApplicationStopped.Register(() =>
    {
        //Quzrtz关闭方法
        //quartz.Stop();
    });

生成cron:http://cron.ciding.cc/


参考:https://blog.csdn.net/qq_44965678/article/details/122159501

          https://blog.csdn.net/xiaolu1014/article/details/103863979