.NET Core'da Quartz Kullanımı (Yeni Versiyon)
06-04-2021Cron Konfigürasyon İşlemi
public static class CronConfigureService
{
public static void AddJobAndTrigger<T>(this IServiceCollectionQuartzConfigurator quartz,
IConfiguration config) where T : IJob {
// Use the name of the IJob as the appsettings.json key
var jobName = typeof(T).Name;
#if DEBUG
jobName = typeof(T).Name+"Debug";
if (string.IsNullOrEmpty(config[$"Quartz:{jobName}"])) jobName = typeof(T).Name;
#endif
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}");
}
// register the job as before
var jobKey = new JobKey(jobName);
quartz.AddJob<T>(opts => opts.WithIdentity(jobKey));
quartz.AddTrigger(opts => opts
.ForJob(jobKey)
.WithIdentity(jobName + "-trigger")
.WithCronSchedule(cronSchedule)); // use the schedule from configuration
}
}
Job Tanımlama
public class StopHesSearchJob : IJob
{
private readonly IHesService _hesService;
private static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod()?.DeclaringType);
public StopHesSearchJob(IHesService hesService)
{
_hesService = hesService;
}
public Task Execute(IJobExecutionContext context)
{
Logger.Info("Stop hes search job çalışıyor ");
_hesService.UpdateHesStatusPassive();
return Task.CompletedTask;
}
}
Burada 3. adımda yer alan IHesService otomatik olarak inject edilebilmesi için, UseMicrosoftDependencyInjectionScopedJobFactory() metodu kullanılarak aşağıdaki gibi .NET Core'da Program.cs dosyasında ayar yapılması gerekmektedir:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) => { ConfigureQuartz(services, hostContext); })
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
private static void ConfigureQuartz(IServiceCollection services, HostBuilderContext hostContext)
{
services.AddQuartz(q =>
{
q.UseMicrosoftDependencyInjectionScopedJobFactory();
q.UseSimpleTypeLoader();
q.UseInMemoryStore();
q.UseDefaultThreadPool(tp => { tp.MaxConcurrency = 10; });
q.AddJobAndTrigger<StopHesSearchJob>(hostContext.Configuration); //Yukarıda tanımlanmıştır.
});
// ASP.NET Core hosting
services.AddQuartzServer(options =>
{
// Çalışan job'ları durdurmak için bu özellik true olmalıdır.
options.WaitForJobsToComplete = true;
});
}
Nuget Gerekli Kütüphaneler
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="5.0.0" /> <PackageReference Include="Quartz.AspNetCore" Version="3.2.4" /> <PackageReference Include="Quartz" Version="3.2.4" /> <PackageReference Include="Quartz.Extensions.DependencyInjection" Version="3.2.4" />
appsettings.json dosyasının güncellenmesi
"Quartz": {
"StopHesSearchJob": "0 0 1 ? * * *",
"StopHesSearchJobDebug": "0 * * ? * *"
}
Burada dikkat edilecek husus şudur: StopHesSearchJob isminde bir Job sınıfı olmak zorundadır!