如何在 Quartz.net 中通过 DI 使用添加的调度程序

Posted

技术标签:

【中文标题】如何在 Quartz.net 中通过 DI 使用添加的调度程序【英文标题】:How to use added scheduler using DI in Quartz.net 【发布时间】: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

【问题讨论】:

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

【讨论】:

以上是关于如何在 Quartz.net 中通过 DI 使用添加的调度程序的主要内容,如果未能解决你的问题,请参考以下文章

在与 Entity Framework 的事务中通过 MassTransit 发送消息

如何在 Windows 服务中使用 Quartz.Net 安排任务?

在 Android 中通过 Hilt 进行依赖项注入

在 Android 中通过 Hilt 进行依赖项注入

如何在 Quartz.NET 作业中注入 NavigationManager?

Quartz.net持久化与集群部署开发详解