.net Quartzmon / Quartzmin未检测到服务

2uluyalo  于 2023-10-21  发布在  .NET
关注(0)|答案(1)|浏览(116)

目前,我正在开发一个任务调度项目使用石英与.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,因为它没有被示例化。
这有点令人困惑,因为我已经在服务配置中注册了它。
有人能帮忙吗?

jbose2ul

jbose2ul1#

这看起来像是一个依赖注入问题:/默认情况下,Quartz不了解.NET依赖注入容器,因此无法从中解析服务。这意味着当Quartz尝试示例化RepoJob类时,它无法解析IRepository依赖项,因此会默默失败。
要解决这个问题,您可以尝试将Quartz与.NET依赖注入系统集成。这将使Quartz能够从容器中解析其作业及其依赖关系。
尝试修改Program.cs以使用带有DI的Quartz,如以下示例所示:

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 add package Quartz.Extensions.DependencyInjection
我希望它工作!

相关问题