[英]How to dynamically create background tasks using Quartz.Net based on schedules inserted to database?
我正在 .NET Core 中實現多個后台任務/作業。 我想做的是:
我找到了這篇文章,但多個作業不是動態創建的。
我所做的是如下:
配置石英的擴展:
public static class QuartzConfigurationExtension
{
public static void AddJobAndTriggers<T>(this IServiceCollectionQuartzConfigurator quartz, IConfiguration config) where T : IJob
{
string jobName = typeof(T).Name;
var configKey = $"Quartz:{jobName}";
var cronSchedule = config[configKey];
if (string.IsNullOrEmpty(cronSchedule))
{
throw new Exception($"No Quartz.NET cron schedule found for job in configuration at {configKey}");
}
var jobKey = new JobKey(jobName);
quartz.AddJob<T>(opts => opts.WithIdentity(jobKey));
quartz.AddTrigger(opts => opts
.ForJob(jobKey)
.WithIdentity(jobName + "-trigger")
.WithCronSchedule(cronSchedule)
);
}
}
職位類別:
public class DataSyncJob : IJob
{
public DataSyncJob()
{
}
public async Task Execute(IJobExecutionContext context)
{
// do something
}
}
啟動:(按原樣)適用於一項工作
services.AddQuartz(q =>
{
q.UseMicrosoftDependencyInjectionJobFactory();
q.AddJobAndTrigger<DataSyncJob>(Configuration);
});
services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true);
啟動:(預期)從數據庫動態獲取計划並循環創建計划作業。 *** >> 有可能嗎?
var db = services.BuildServiceProvider()
.GetService<dbContext>();
var schedules = db.SyncSchedule.ToListAsync();
foreach (var schedule in schedules.Result)
{
services.AddQuartz(q =>
{
q.UseMicrosoftDependencyInjectionJobFactory();
q.AddJobAndTrigger<DataSyncJob>(Configuration); **// how to create generic Job classes based on schedules?**
});
services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true);
}
我不會在Startup
動態創建工作。 此代碼不應與數據庫對話。 相反,我建議創建另一個工作來處理它。 這就是,連接您的數據庫,獲取所有信息並創建更多工作。
為了管理它們,請使用IScheduler
。 您可以通過Execute
方法的context.Scheduler
獲取它。 這包含您需要的一切,如ScheduleJob
、 DeleteJob
等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.