Quartz.NET Zamanlanmış İşleri
Quartz.NET ile işler ve tetikleyiciler tanımlayın, cron ifadelerini kullanın ve ASP.NET Core DI ile bütünleştirin.
Quartz.NET Zamanlanmış İşleri, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.
Neden Quartz.NET?
Cron ifadelerine, iş kalıcılığına, kümelemeye, yeniden deneme ilkelerine ve iş zincirlerine ihtiyaç duyduğunuzda Quartz.NET, PeriodicTimer'ın sunduklarının ötesinde üretim kullanımı için uygun bir zamanlayıcı sağlar. Bu, popüler Java Quartz zamanlayıcısının .NET uyarlamasıdır.
Quartz.NET'i Yükleme
Quartz ve Quartz.AspNetCore paketlerini ekleyin. ASP.NET tümleştirmesi, zamanlayıcıyı barındırılan bir hizmet olarak otomatik biçimde kaydeder.
# Install packages
dotnet add package Quartz
dotnet add package Quartz.AspNetCore
# Optional: persistence (requires Quartz.Serialization.Json too)
# dotnet add package Quartz.Jobs
# dotnet add package Quartz.Pluginsİş Tanımlama
IJob (veya yeni Quartz sürümlerindeki IAsyncJob) arabirimini Execute yöntemiyle uygulayın. İş bağlamı, çalışma zamanı verilerini ve geçerli tetikleyici bilgilerini sağlar.
using Quartz;
[DisallowConcurrentExecution] // prevent overlapping executions
public class ReportGeneratorJob : IJob
{
private readonly IReportService _reports;
private readonly ILogger<ReportGeneratorJob> _logger;
public ReportGeneratorJob(IReportService r, ILogger<ReportGeneratorJob> l)
{ _reports = r; _logger = l; }
public async Task Execute(IJobExecutionContext context)
{
_logger.LogInformation("Generating report at {Time}", DateTime.UtcNow);
await _reports.GenerateDailyReportAsync(context.CancellationToken);
_logger.LogInformation("Report generated");
}
}ASP.NET Core'da Quartz Kaydetme
Zamanlayıcıyı yapılandırmak için AddQuartz, onu IHostedService olarak çalıştırmak için AddQuartzHostedService kullanın. İşler ve tetikleyiciler lambda içinde yapılandırılır.
builder.Services.AddQuartz(q =>
{
q.UseMicrosoftDependencyInjectionJobFactory();
var jobKey = new JobKey("ReportGenerator");
q.AddJob<ReportGeneratorJob>(opts => opts.WithIdentity(jobKey));
q.AddTrigger(opts => opts
.ForJob(jobKey)
.WithIdentity("ReportTrigger")
.WithCronSchedule("0 0 8 * * ?") // 8:00 AM daily
);
});
builder.Services.AddQuartzHostedService(q =>
q.WaitForJobsToComplete = true);Cron İfadesi Söz Dizimi
Quartz, 6 veya 7 alanlı bir cron ifadesi kullanır: seconds minutes hours day-of-month month day-of-week [year]. Quartz cron'u Unix cron'undan biraz farklıdır; saniyeler ilk sıradadır.
// Quartz cron format: sec min hour dom month dow [year]
"0 0 8 * * ?" // Every day at 8:00 AM
"0 0/30 9-17 * * ?" // Every 30 min, 9 AM - 5 PM weekdays
"0 0 0 1 * ?" // First day of every month at midnight
"0 0 6 ? * MON-FRI" // Every weekday at 6 AM
"0 0/5 * * * ?" // Every 5 minutes
// Tip: use cronmaker.com or crontab.guru to build expressionsBasit Tetikleyiciler
Cron karmaşıklığı olmayan, aralığa dayalı zamanlamalar için WithSimpleSchedule ile basit tetikleyiciler kullanın.
q.AddTrigger(opts => opts
.ForJob(jobKey)
.WithIdentity("CleanupTrigger")
.StartNow()
.WithSimpleSchedule(s => s
.WithIntervalInHours(1)
.RepeatForever())
);
// Or a one-shot trigger:
q.AddTrigger(opts => opts
.ForJob(jobKey)
.WithIdentity("OneShot")
.StartAt(DateTimeOffset.UtcNow.AddMinutes(5)));İş Verileri Haritası
Çalışma zamanı parametrelerini JobDataMap aracılığıyla işlere aktarın. Bunlara Execute içinde context.JobDetail.JobDataMap üzerinden erişin.
q.AddJob<EmailJob>(opts => opts
.WithIdentity("EmailJob")
.UsingJobData("to", "admin@example.com")
.UsingJobData("subject", "Daily Digest"));
// Inside the job:
public async Task Execute(IJobExecutionContext context)
{
var to = context.JobDetail.JobDataMap.GetString("to");
var subject = context.JobDetail.JobDataMap.GetString("subject");
await _mailer.SendAsync(to!, subject!, "body");
}DisallowConcurrentExecution
[DisallowConcurrentExecution], önceki bir örnek hâlâ çalışırken işin yeni bir örneğinin başlamasını önler. Paylaşılan kaynaklara erişen işler için zorunludur.
[DisallowConcurrentExecution]
public class InventorySyncJob : IJob
{
// If a sync takes > 1 minute and triggers every minute,
// the next trigger is delayed until this one completes
public async Task Execute(IJobExecutionContext context)
{
await SyncInventoryAsync(context.CancellationToken);
}
}
// Without [DisallowConcurrentExecution], multiple instances
// could run in parallel, causing data conflicts.Hata İşleme ve Yeniden Deneme
İş kodunu try/catch içine alın. Quartz'a işi hemen veya bir gecikmeden sonra yeniden çalıştırmasını bildirmek için JobExecutionException fırlatın.
public async Task Execute(IJobExecutionContext context)
{
try
{
await ProcessAsync(context.CancellationToken);
}
catch (TransientException ex)
{
// Ask Quartz to retry immediately
var jobException = new JobExecutionException(ex)
{
RefireImmediately = true
};
throw jobException;
}
catch (Exception ex)
{
_logger.LogError(ex, "Job failed — not retrying");
// Don't rethrow — job is done
}
}Gerçek Dünya: Çok İşli Zamanlayıcı
Farklı zamanlamalara sahip birden çok iş içeren ve tüm hizmetler için DI kullanan üretim ortamına uygun bir Quartz kurulumu.
builder.Services.AddQuartz(q =>
{
q.UseMicrosoftDependencyInjectionJobFactory();
// Daily report at 8 AM
var reportKey = new JobKey("DailyReport");
q.AddJob<ReportGeneratorJob>(o => o.WithIdentity(reportKey));
q.AddTrigger(o => o.ForJob(reportKey)
.WithCronSchedule("0 0 8 * * ?"));
// Inventory sync every 15 minutes
var syncKey = new JobKey("InventorySync");
q.AddJob<InventorySyncJob>(o => o.WithIdentity(syncKey));
q.AddTrigger(o => o.ForJob(syncKey)
.WithSimpleSchedule(s => s
.WithIntervalInMinutes(15)
.RepeatForever()));
// Cache cleanup every night at 2 AM
var cacheKey = new JobKey("CacheCleanup");
q.AddJob<CacheCleanupJob>(o => o.WithIdentity(cacheKey));
q.AddTrigger(o => o.ForJob(cacheKey)
.WithCronSchedule("0 0 2 * * ?"));
});Kısa Kontrol
[DisallowConcurrentExecution] özniteliği bir Quartz.NET işinde ne yapar?
Özet: Quartz.NET Zamanlanmış İşleri
Temel çıkarımlar:
- Quartz.NET: cron, kalıcılık ve kümeleme özelliklerine sahip, üretim kullanımı için uygun bir zamanlayıcıdır
- İşleri, Execute yöntemiyle IJob uygulayarak tanımlayın
- AddQuartz + AddQuartzHostedService ile kaydedin; işler DI farkındalığına sahiptir
- Cron biçimi: saniye dakika saat ayın-günü ay haftanın-günü — saniyelerin ilk sırada olduğuna dikkat edin
[DisallowConcurrentExecution]: yeniden çalıştırmadan önce mevcut çalıştırmanın tamamlanmasını bekler- Çalışma zamanı parametrelerini işlere aktarmak için JobDataMap kullanın
Yapay zeka eğitmeniyle C# öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 93
- Dersler
- 346
Sıkça Sorulan Sorular
“Quartz.NET Zamanlanmış İşleri” dersi ücretsiz mi?
Evet — “Quartz.NET Zamanlanmış İşleri” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.
“Quartz.NET Zamanlanmış İşleri” dersinde ne öğreneceğim?
Quartz.NET ile işler ve tetikleyiciler tanımlayın, cron ifadelerini kullanın ve ASP.NET Core DI ile bütünleştirin. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C# Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Quartz.NET Zamanlanmış İşleri” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- IHostedService ve BackgroundService
- Worker Service Projeleri
- Düzenli Görevler ve Zamanlayıcılar
- Quartz.NET Zamanlanmış İşleri