Quartz.SchedulerException:实例化类时出现问题 - Quartz 未按预期执行

问题描述 投票:0回答:4

这是我的

Job
,需要每一分钟执行一次,这依赖于
logger

public class RefreshJob :IJob
{
    public RefreshJob(IContainerFactory containerFactory)
    {
        _logger = containerFactory.GetInstance<ILogger>();          
    }

    public Task Execute(IJobExecutionContext context)
    {
         return Task.Run(() =>
            {
                _logger.Information("Executing sample job");
                _logger.Information($"Name: {context.JobDetail.Key.Name}");
                _logger.Information($"Description: '{context.JobDetail.Description}'");
                _logger.Information($"Fire time utc: {context.FireTimeUtc:yyyy-MM-dd HH:mm:ss zzz}");
            });
    }
}

这是我的

dependency injection

   var containerFactory = new ContainerFactory();//class with GetInstance method.
  _builder.Register(c => new RefreshJob(containerFactory)).SingleInstance();

这就是我获得

scheduler
参考的方式

static async Task<IScheduler> GetScheduler()
{
    var factory = new StdSchedulerFactory();
    return await factory.GetScheduler();
}

我在我的

start
windows service

方法中使用它
public void Start()
{
    Task<IScheduler> scheduler = GetScheduler();
    scheduler.Wait();
    _jobScheduler = scheduler.Result;
    _jobScheduler.Start();

    //Trigger
    IJobDetail job = JobBuilder.Create<RefreshCacheJob>().Build();
    ITrigger trigger = TriggerBuilder.Create()
        .WithIdentity("RefreshJob", "GroupName")
        .StartAt(DateTime.Now)
        .WithPriority(1)
        .Build();
    _jobScheduler.ScheduleJob(job, trigger);
}

但是什么也没发生。顺便说一下,我在

Quartz
 中使用 
windows service

调度程序

已更新错误

Quartz.SchedulerException:实例化类“Scheduler.RefreshJob”时出现问题 ---> System.ArgumentException:无法实例化没有空构造函数的类型 参数名称:RefreshJob

c# windows-services quartz.net
4个回答
5
投票

如果需要将服务注入到作业中,请按照 @foips 评论的此指南进行操作。基本上你需要在 DI 容器中添加以下行:

services.AddQuartz(q =>
{
    ...
    q.UseMicrosoftDependencyInjectionJobFactory();
    ...
}

2
投票

因此设置 UseMicrosoftDependencyInjectionJobFactory 有效

但是尽管明确注入了服务,日志仍然显示该错误 进入工作。


0
投票

Quartz 需要一个对象来调用执行的函数,请创建一个空的构造函数来实例化 Quartz 可以使用的对象。

如本文档所述

此行为的后果之一是作业必须具有无参构造函数(当使用默认的 JobFactory 实现时)。


0
投票

问题是“等待工厂.GetScheduler();”

更改为“(awaitfactory.GetAllSchedulers()).First();”那么它应该可以工作

不知何故,Quartz 创建了 2 个调度程序实例,以及“q.UseMicrosoftDependencyInjectionJobFactory();”仅在第一个调度程序上启用依赖注入,而不是在第二个调度程序上启用依赖注入

当您调用“factory.GetScheduler()”时,它实际上返回不支持依赖注入的第二个调度程序实例。

© www.soinside.com 2019 - 2024. All rights reserved.