Quartzmon / Quartzmin 未检测到服务

问题描述 投票:0回答:1

目前,我正在使用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,因为它没有实例化。

这有点令人困惑,因为我已经在服务配置中注册了它。

有人可以帮忙吗?

c# .net asp.net-core quartz.net
1个回答
0
投票

看起来像是依赖注入问题:/ 默认情况下,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

我希望它有效!

© www.soinside.com 2019 - 2024. All rights reserved.