簡體   English   中英

如何根據插入到數據庫的時間表使用 Quartz.Net 動態創建后台任務?

[英]How to dynamically create background tasks using Quartz.Net based on schedules inserted to database?

我正在 .NET Core 中實現多個后台任務/作業。 我想做的是:

  1. 在數據庫中創建和插入時間表。
  2. 根據 1 中創建的計划創建定時后台任務。我正在使用Quartz.NET包。 1 完成,所以我需要幫助動態創建后台任務。

我找到了這篇文章,但多個作業不是動態創建的。

我所做的是如下:

配置石英的擴展:

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獲取它。 這包含您需要的一切,如ScheduleJobDeleteJob等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM