.Net Core中使用Quartz實現后台定時任務


阿里雲優惠活動

一、Quartz介紹

Quartz項目地址:https://github.com/quartz-scheduler/quartz

里面可以看到介紹:

Quartz is a richly featured, open source job scheduling library that can be integrated within virtually any Java application - from the smallest stand-alone application to the largest e-commerce system.

.Net Core可以通過hosted services很好的實現后台任務,Hosted services跟隨.Net Core應用啟動而在后台啟動。創建一個Quartz.NET的host service可以使用Quartz

Quartz可以通過其Cron表達式實現復雜定時規則的定時任務。

二、引用相關類庫

在Nuget中引用類庫:Quartz.Net

三、創建Job

創建的Job要實現IJob,我們這里創建兩個Job:

[DisallowConcurrentExecution]
    public class HelloWorldJob : IJob
    {
        private readonly ILogger<HelloWorldJob> _logger;
        public HelloWorldJob(ILogger<HelloWorldJob> logger)
        {
            _logger = logger;
        }

        public Task Execute(IJobExecutionContext context)
        {
            _logger.LogInformation("Hello world!");
            return Task.CompletedTask;
        }
    }
[DisallowConcurrentExecution]
    public class IntroduceJob : IJob
    {
        private readonly ILogger<IntroduceJob> _logger;
        public IntroduceJob(ILogger<IntroduceJob> logger)
        {
            _logger = logger;
        }

        public Task Execute(IJobExecutionContext context)
        {
            _logger.LogInformation("My name is yang");
            return Task.CompletedTask;
        }
    }

關於特性DisallowConcurrentExecution的介紹可以看這里:DisallowConcurrentExecution防止運行多個相同的任務實例

四、創建JobFactory

    public class SingletonJobFactory : IJobFactory
    {
        private readonly IServiceProvider _serviceProvider;
        public SingletonJobFactory(IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }

        public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
        {
            return _serviceProvider.GetRequiredService(bundle.JobDetail.JobType) as IJob;
        }

        public void ReturnJob(IJob job) { }
    }

五、配置Job

配置Job我們創建一個類JobSchedule

public class JobSchedule
    {
        public JobSchedule(Type jobType, string cronExpression)
        {
            JobType = jobType;
            CronExpression = cronExpression;
        }

        public Type JobType { get; }
        public string CronExpression { get; }
    }

六、在StartUp的ConfigureServices中注入

            // Add Quartz services
            services.AddSingleton<IJobFactory, SingletonJobFactory>();
            services.AddSingleton<ISchedulerFactory, StdSchedulerFactory>();

            // Add our job
            services.AddSingleton<HelloWorldJob>();
            services.AddSingleton<IntroduceJob>();

            services.AddJob();
           
            services.AddHostedService<QuartzHostedService>();

創建ServiceCollectionExtensions注入schedule

  public static class ServiceCollectionExtensions
    {
        public static void AddJob(this IServiceCollection services)
        {
            services.AddSingleton(new JobSchedule(
               jobType: typeof(HelloWorldJob),
               cronExpression: "0/2 * * * * ?")); // run every 2 seconds

            services.AddSingleton(new JobSchedule(
                jobType: typeof(IntroduceJob), cronExpression: "0/5 * * * * ?"));
        }
    }

 

七、創建QuartzHostedService

public class QuartzHostedService : IHostedService
    {
        private readonly ISchedulerFactory _schedulerFactory;
        private readonly IJobFactory _jobFactory;
        private readonly IEnumerable<JobSchedule> _jobSchedules;

        public QuartzHostedService(
            ISchedulerFactory schedulerFactory,
            IJobFactory jobFactory,
            IEnumerable<JobSchedule> jobSchedules)
        {
            _schedulerFactory = schedulerFactory;
            _jobSchedules = jobSchedules;
            _jobFactory = jobFactory;
        }
        public IScheduler Scheduler { get; set; }

        public async Task StartAsync(CancellationToken cancellationToken)
        {
            Scheduler = await _schedulerFactory.GetScheduler(cancellationToken);
            Scheduler.JobFactory = _jobFactory;

            foreach (var jobSchedule in _jobSchedules)
            {
                var job = CreateJob(jobSchedule);
                var trigger = CreateTrigger(jobSchedule);

                await Scheduler.ScheduleJob(job, trigger, cancellationToken);
            }

            await Scheduler.Start(cancellationToken);
        }

        public async Task StopAsync(CancellationToken cancellationToken)
        {
            await Scheduler?.Shutdown(cancellationToken);
        }

        private static IJobDetail CreateJob(JobSchedule schedule)
        {
            var jobType = schedule.JobType;
            return JobBuilder
                .Create(jobType)
                .WithIdentity(jobType.FullName)
                .WithDescription(jobType.Name)
                .Build();
        }

        private static ITrigger CreateTrigger(JobSchedule schedule)
        {
            return TriggerBuilder
                .Create()
                .WithIdentity($"{schedule.JobType.FullName}.trigger")
                .WithCronSchedule(schedule.CronExpression)
                .WithDescription(schedule.CronExpression)
                .Build();
        }
    }

八、運行程序

可以看到如下效果

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM