这是我的
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
如果需要将服务注入到作业中,请按照 @foips 评论的此指南进行操作。基本上你需要在 DI 容器中添加以下行:
services.AddQuartz(q =>
{
...
q.UseMicrosoftDependencyInjectionJobFactory();
...
}
因此设置 UseMicrosoftDependencyInjectionJobFactory 有效
但是尽管明确注入了服务,日志仍然显示该错误 进入工作。
Quartz 需要一个对象来调用执行的函数,请创建一个空的构造函数来实例化 Quartz 可以使用的对象。
此行为的后果之一是作业必须具有无参构造函数(当使用默认的 JobFactory 实现时)。
问题是“等待工厂.GetScheduler();”
更改为“(awaitfactory.GetAllSchedulers()).First();”那么它应该可以工作
不知何故,Quartz 创建了 2 个调度程序实例,以及“q.UseMicrosoftDependencyInjectionJobFactory();”仅在第一个调度程序上启用依赖注入,而不是在第二个调度程序上启用依赖注入
当您调用“factory.GetScheduler()”时,它实际上返回不支持依赖注入的第二个调度程序实例。