【问题标题】:Add a custom job factory in quartz .net 5在石英 .net 5 中添加自定义作业工厂
【发布时间】:2021-07-28 09:23:41
【问题描述】:

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

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&lt;JobFactory&gt;();

【问题讨论】:

  • 在配置 Quartz 之前,您是否在 DI services.AddSingleton&lt;IJobFactory, JobFactory&gt;() 中注册了工厂? github.com/quartznet/quartznet/blob/…
  • @abdusco 我也试试这个,但我无法调用 JobLogDecorator 和 jobfactory

标签: c# asp.net-core .net-core quartz.net


【解决方案1】:

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

  1. 注册工厂q.UseJobFactory&lt;JobFactory&gt;();
  2. 删除q.UseMicrosoftDependencyInjectionJobFactory();
  3. 注册工作而不是工厂,例如,如果我有 MaintenanceJob,我将这个工作注册为 services.AddTransient&lt;MaintenanceJob&gt;();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    相关资源
    最近更新 更多