繁体   English   中英

在quartz .net 5 中添加自定义作业工厂

[英]Add a custom job factory in quartz .net 5

您好,我创建了一个自定义作业工厂,如下所示

class JobFactory : IJobFactory
    {
        protected readonly IServiceProvider _container;

        public JobFactory(IServiceProvider container)
        {
            _container = container;
        }

        public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
        {
            var job = (IJob)_container.GetService(bundle.JobDetail.JobType)!;
            var logTime = _container.GetService<ILogTime>()!;
            return new JobLogDecorator(job,logTime);
        }

        public void ReturnJob(IJob job)
        {
            (job as IDisposable)?.Dispose();
        }
    }

JobLogDecorator 是一个简单的类,用于记录装饰作业所用的时间

public class JobLogDecorator : IJob
    {
        private readonly IJob _decorated;
        private readonly ILogTime _log;

        public JobLogDecorator (IJob decorated, ILogTime log)
        {
            _decorated = decorated;
            _log = log;
        }

        public async Task Execute(IJobExecutionContext context)
        {
            var jobName = context.JobDetail.Key.Name;
            var sw = Stopwatch.StartNew();

                await _decorated.Execute(context);

                _log.Log(sw.ElapsedMilliseconds, jobName);

        }
    }

现在我想注册石英和这个工作工厂。 在启动时我已经注册,但我不明白如何注册我的自定义作业工厂

services.AddQuartz(q =>
                {
                    q.SchedulerId = "MyJob";
                    q.SchedulerName = "MyJob";
                    
                    //i try to add this but i cannot hit the JobLogDecorator when the job is running
                    q.UseJobFactory<JobFactory>();
                    //i cannot understand how to configure this method
                    q.UseMicrosoftDependencyInjectionJobFactory();

                });

                services.AddQuartzHostedService(options =>
                {
                    options.WaitForJobsToComplete = true;
                });

结果我无法点击/调用 JobFactory ,JobLogDecorator 我也注册了services.AddSingleton<JobFactory>();

我发现当您要注册您的自定义工厂时的问题,您必须按照以下步骤操作

  1. 注册工厂q.UseJobFactory<JobFactory>();
  2. 删除q.UseMicrosoftDependencyInjectionJobFactory();
  3. 注册工作而不是工厂,例如,如果我有维护工作,我将此工作注册为services.AddTransient<MaintenanceJob>();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM