如何在 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 安排任务?