目前,我正在开发一个任务调度项目使用石英与.net 6。然而,我没有足够的时间和知识来开发管理工具的UI。在搜索了一些文章后,我发现了这个:Quartzmin,一个用于quartz的管理工具。Quartzmon的一个分支与.net core兼容。
所以我尝试在我的项目中实现它,但我发现了一个问题,QuartzJob无法与注册服务一起运行。
Program.cs
var buildConfig = Host.CreateDefaultBuilder();
buildConfig.ConfigureWebHostDefaults(config =>
{
config.ConfigureServices(service =>
{
service.AddSingleton<IRepository, Repository>();
service.AddQuartzmon();
});
config.Configure(app =>
{
var scheduler = Scheduler.Create().Result;
app.UseQuartzmon(new QuartzmonOptions()
{
Scheduler = scheduler,
VirtualPathRoot = "/Quartzmon",
UseLocalTime = true
});
});
});
var builder = buildConfig.Build();
await builder.RunAsync();
工作&工作
public static class Scheduler
{
public static async Task<IScheduler> Create()
{
var scheduler = await StdSchedulerFactory.GetDefaultScheduler();
var job = JobBuilder.Create<RepoJob>.StoreDurably().Build();
var trigger = TriggerBuilder.Create().StartNow().WithSimpleSchedule(sc => sc.WithIntervalInMinutes(5)).Build();
await scheduler.Schedule(job, trigger);
await scheduler.Start();
return scheduler;
}
}
public class RepoJob : IJob
{
private readonly IRepository _repo;
public RepoJob(IRepository repo)
{
_repo = repo;
}
public async Task Execute(IJobExecutionContext context)
{
await Console.Out.WriteLineAsync("This is a Test Job");
// Do Logic Repository Work
// repo.DoStuff();
}
}
当我启动应用程序时,什么也没有发生。但是当我为RepoJob创建一个无参数的构造函数并运行应用程序时,它会运行execute函数。但是这会导致repo对象为null,因为它没有被示例化。
这有点令人困惑,因为我已经在服务配置中注册了它。
有人能帮忙吗?
1条答案
按热度按时间jbose2ul1#
这看起来像是一个依赖注入问题:/默认情况下,Quartz不了解.NET依赖注入容器,因此无法从中解析服务。这意味着当Quartz尝试示例化RepoJob类时,它无法解析IRepository依赖项,因此会默默失败。
要解决这个问题,您可以尝试将Quartz与.NET依赖注入系统集成。这将使Quartz能够从容器中解析其作业及其依赖关系。
尝试修改Program.cs以使用带有DI的Quartz,如以下示例所示:
哦!确保你已经安装了Quartz.Extensions.DependencyInjection包。这个包提供了扩展来集成Quartz和.NET内置的依赖注入。-> dotnet add package Quartz.Extensions.DependencyInjection
我希望它工作!