目前,我正在使用quartz和.net 6开发一个任务调度程序项目。但是,我没有足够的时间和知识来开发管理工具的UI。在搜索了一些文章后,我发现了这个:Quartzmin,一个quartz的管理工具。 Quartzmon 的一个分支与 .net core 兼容。
所以我尝试在我的项目中实现它,但我发现了一个问题,QuartzJob 无法使用注册服务运行。
程序.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 创建一个无参数构造函数并运行应用程序时,它会运行执行函数。但这会导致 repo 对象为 null,因为它没有实例化。
这有点令人困惑,因为我已经在服务配置中注册了它。
有人可以帮忙吗?
看起来像是依赖注入问题:/ 默认情况下,Quartz 不知道 .NET 依赖注入容器,并且无法从中解析服务。这意味着当 Quartz 尝试实例化 RepoJob 类时,它无法解析 IRepository 依赖项,因此会默默失败。 要解决此问题,您可以尝试将 Quartz 与 .NET 依赖注入系统集成。这将使 Quartz 能够从容器中解析其作业及其依赖项。 尝试修改 Program.cs 以将 Quartz 与 DI 结合使用,如以下示例所示:
var buildConfig = Host.CreateDefaultBuilder();
buildConfig.ConfigureWebHostDefaults(config =>
{
config.ConfigureServices(services =>
{
services.AddSingleton<IRepository, Repository>();
// Add Quartz services
services.AddQuartz(q =>
{
// Register the job, setting it up to inject IRepository
q.UseMicrosoftDependencyInjectionScopedJobFactory();
var jobKey = new JobKey("RepoJobKey");
q.AddJob<RepoJob>(opts => opts.WithIdentity(jobKey));
q.AddTrigger(t => t
.WithIdentity("RepoTrigger")
.ForJob(jobKey)
.StartNow()
.WithSimpleSchedule(x => x.WithIntervalInMinutes(5))
);
});
services.AddQuartzHostedService(options =>
{
options.WaitForJobsToComplete = true;
});
services.AddQuartzmon();
});
config.Configure(app =>
{
var scheduler = app.ApplicationServices.GetService<IScheduler>();
app.UseQuartzmon(new QuartzmonOptions()
{
Scheduler = scheduler,
VirtualPathRoot = "/Quartzmon",
UseLocalTime = true
});
});
});
var builder = buildConfig.Build();
await builder.RunAsync();
噢!确保您已安装 Quartz.Extensions.DependencyInjection 包。该包提供了将 Quartz 与 .NET 内置依赖项注入集成的扩展。 -> dotnet 添加包 Quartz.Extensions.DependencyInjection
我希望它有效!