Quartz.Net Dependency Injection .Net Core

前端 未结 4 873
无人及你
无人及你 2021-01-11 15:08

In my project I have to use Quartz but I don\'t know what i do wrong.

JobFactory:

public class IoCJobFactory :         


        
4条回答
  •  Happy的楠姐
    2021-01-11 15:56

    This is just a simple sample of my solution to solve IoC problem:

    JobFactory.cs

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

    Startup.cs

    public void Configure(IApplicationBuilder app, 
                IHostingEnvironment env, 
                ILoggerFactory loggerFactory,
                IApplicationLifetime lifetime,
                IServiceProvider container)
            {
                loggerFactory.AddConsole(Configuration.GetSection("Logging"));
                loggerFactory.AddDebug();
    
                app.UseMvc();
    
                // the following 3 lines hook QuartzStartup into web host lifecycle
                var quartz = new QuartzStartup(container);
                lifetime.ApplicationStarted.Register(quartz.Start);
                lifetime.ApplicationStopping.Register(quartz.Stop);
            }
    

    QuartzStartup.cs

    public class QuartzStartup
        {
            private IScheduler _scheduler; // after Start, and until shutdown completes, references the scheduler object
            private readonly IServiceProvider container;
    
            public QuartzStartup(IServiceProvider container)
            {
                this.container = container;
            }
    
            // starts the scheduler, defines the jobs and the triggers
            public void Start()
            {
                if (_scheduler != null)
                {
                    throw new InvalidOperationException("Already started.");
                }
    
                var schedulerFactory = new StdSchedulerFactory();
                _scheduler = schedulerFactory.GetScheduler().Result;
                _scheduler.JobFactory = new JobFactory(container);
                _scheduler.Start().Wait();
    
                var voteJob = JobBuilder.Create()
                    .Build();
    
                var voteJobTrigger = TriggerBuilder.Create()
                    .StartNow()
                    .WithSimpleSchedule(s => s
                        .WithIntervalInSeconds(60)
                        .RepeatForever())
                    .Build();
    
                _scheduler.ScheduleJob(voteJob, voteJobTrigger).Wait();
            }
    
            // initiates shutdown of the scheduler, and waits until jobs exit gracefully (within allotted timeout)
            public void Stop()
            {
                if (_scheduler == null)
                {
                    return;
                }
    
                // give running jobs 30 sec (for example) to stop gracefully
                if (_scheduler.Shutdown(waitForJobsToComplete: true).Wait(30000))
                {
                    _scheduler = null;
                }
                else
                {
                    // jobs didn't exit in timely fashion - log a warning...
                }
            }
        }  
    

    consider that you should register your service into the container (in my case VoteJob) in advance.
    I implement this based on this answer.
    I hope it can be helpful.

提交回复
热议问题