How to start Quartz in ASP.NET Core?

后端 未结 5 1395
你的背包
你的背包 2020-12-02 07:00

I have the following class

 public class MyEmailService
 {
    public async Task SendAdminEmails()
    {
        ...
    }
    public async Task&         


        
5条回答
  •  天涯浪人
    2020-12-02 07:28

    In addition to @felix-b answer. Adding DI to jobs. Also QuartzStartup Start can be made async.

    Based on this answer: https://stackoverflow.com/a/42158004/1235390

    public class QuartzStartup 
    {
        public QuartzStartup(IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }
    
        public async Task Start()
        {
            // other code is same
            _scheduler = await schedulerFactory.GetScheduler();
            _scheduler.JobFactory = new JobFactory(_serviceProvider);
    
            await _scheduler.Start();
            var sampleJob = JobBuilder.Create().Build();
            var sampleTrigger = TriggerBuilder.Create().StartNow().WithCronSchedule("0 0/1 * * * ?").Build();
            await _scheduler.ScheduleJob(sampleJob, sampleTrigger);
        }
    }
    

    JobFactory class

    public class JobFactory : IJobFactory
    {
        private IServiceProvider _serviceProvider;
        public JobFactory(IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }
    
        public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
        {
            return _serviceProvider.GetService(bundle.JobDetail.JobType) as IJob;
        }
    
        public void ReturnJob(IJob job)
        {
            (job as IDisposable)?.Dispose();
        }
    }
    

    Startup class:

    public void ConfigureServices(IServiceCollection services)
    {
         // other code is removed for brevity
         // need to register all JOBS by their class name
         services.AddTransient();
    }
    
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime applicationLifetime)
    {
        var quartz = new QuartzStartup(_services.BuildServiceProvider());
        applicationLifetime.ApplicationStarted.Register(() => quartz.Start());
        applicationLifetime.ApplicationStopping.Register(quartz.Stop);
    
        // other code removed for brevity
    }
    

    SampleJob class with contructor dependency injection:

    public class SampleJob : IJob
    {
        private readonly ILogger _logger;
    
        public SampleJob(ILogger logger)
        {
            _logger = logger;
        }
    
        public async Task Execute(IJobExecutionContext context)
        {
            _logger.LogDebug("Execute called");
        }
    }
    

提交回复
热议问题