Quartz.SchedulerException: 创建类时出错 - Quartz未按预期执行。

3

这是我的工作,需要每分钟执行一次,它依赖于日志记录器

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}");
            });
    }
}

这里是我的依赖注入

   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();
}

我在 Windows 服务启动方法中使用它。

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);
}

但什么都没有发生。顺便说一下,我正在使用Windows服务内部的Quartz调度程序。

更新了错误

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


1
乍一看,它看起来不错。可能会抛出一些异常,但你可能看不到它们。你尝试过记录日志或添加 ISchedulerListener 来查看是否有异常吗? - Rabban
它可以按秒工作 -> .WithCronSchedule("* * * * * ? *"),但不适用于任何其他cron表达式,如.WithCronSchedule("4 * 0 ? * * *")。 - kudlatiger
2
@Rabban 添加了 ISchedulerListener,这有助于找到问题的原因。看起来依赖注入是个问题。 - kudlatiger
3个回答

5
如果需要将服务注入到任务中,请按照@foips评论中的此指南进行操作。基本上,您需要在DI容器中加入以下代码:
services.AddQuartz(q =>
{
    ...
    q.UseMicrosoftDependencyInjectionJobFactory();
    ...
}

但这已经被弃用了! - undefined

2

虽然使用UseMicrosoftDependencyInjectionJobFactory设置能够工作,但是日志仍然显示错误,尽管已经明确地将服务注入到了任务中。


0

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

如本文档所述

这种行为的一个结果是,作业必须有一个无参数构造函数(当使用默认的JobFactory实现时)。


5
但是如果我需要将一个服务(例如UserService)注入到我的Job中怎么办? - romerompb
1
我知道你可能已经解决了这个问题,但你只需要设置UseMicrosoftDependencyInjectionJobFactory - foips

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接