【问题标题】:How to use added scheduler using DI in Quartz.net如何在 Quartz.net 中通过 DI 使用添加的调度程序
【发布时间】:2021-11-15 01:58:20
【问题描述】:

我在服务启动中添加了调度程序,例如:

services.AddQuartz(q =>
{
    q.SchedulerId = "S1";
    q.SchedulerName = "S1";
    
    q.UseMicrosoftDependencyInjectionJobFactory();

    q.UsePersistentStore(s =>
    {
        s.UseProperties = true;
        s.UsePostgres("ConnectionString");
      
        s.UseJsonSerializer();
    });
})

现在我正在尝试通过 DI 使用这个创建的调度程序,例如:

public SchedulerStartup(ISchedulerFactory schedulerFactory)
{
    this.schedulerFactory = schedulerFactory;
}

public async Task StartAsync(CancellationToken cancellationToken)
{
    Scheduler = await schedulerFactory.GetScheduler("S1", cancellationToken);
    
    await Scheduler.Start(cancellationToken);
}

但不知何故,Scheduler 为空。我无法在启动配置中访问创建的调度程序 (S1)。

链接:https://www.quartz-scheduler.net/documentation/quartz-3.x/packages/microsoft-di-integration.html#di-aware-job-factories

【问题讨论】:

  • 你用什么接口类来实现的?你可以阅读这篇文章,它可能对你有帮助。 stackoverflow.com/questions/42157775/…
  • 只需调用 GetScheduler 而不指定 ID,它将返回您配置的唯一一个。
  • 这里我错过了services.AddQuartzHostedService() 使用托管服务启动调度程序。不需要额外的启动类。 @MarkoLahma

标签: c# asp.net-core quartz.net


【解决方案1】:

这里我错过了services.AddQuartzHostedService() 使用托管服务启动调度程序。不需要额外的启动类。

应该是这样的:

services.AddQuartz(q =>
 {
     q.SchedulerName = "S1";

     q.UseMicrosoftDependencyInjectionJobFactory();
     
     q.UsePersistentStore(s =>
     {
         s.UseProperties = true;
         s.UsePostgres(DbConnectionString);
         s.UseJsonSerializer();
     });
 });

 services.AddQuartzHostedService(options =>
 {
     options.WaitForJobsToComplete = true;
 });

这个Scheduler的后来创建的实例可以用作(S1):

public MyRuntimeScheduler(ISchedulerFactory schedulerFactory)
{
     Scheduler = schedulerFactory.GetScheduler("S1").GetAwaiter().GetResult();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    相关资源
    最近更新 更多