Pekerjaan Terjadwal Quartz.NET
Definisikan pekerjaan dan pemicu dengan Quartz.NET, gunakan ekspresi cron, dan integrasikan dengan DI ASP.NET Core.
Pekerjaan Terjadwal Quartz.NET adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.
Mengapa Quartz.NET?
Jika Anda memerlukan ekspresi cron, persistensi pekerjaan, pengelompokan, kebijakan percobaan ulang, dan rantai pekerjaan — Quartz.NET menyediakan penjadwal siap produksi yang menawarkan lebih banyak kemampuan daripada PeriodicTimer. Quartz.NET merupakan adaptasi .NET dari penjadwal Quartz populer untuk Java.
Memasang Quartz.NET
Tambahkan paket Quartz dan Quartz.AspNetCore. Integrasi ASP.NET secara otomatis mendaftarkan penjadwal sebagai layanan yang di-host.
# 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.PluginsMendefinisikan Pekerjaan
Implementasikan IJob (atau IAsyncJob pada Quartz versi yang lebih baru) dengan metode Execute. Konteks pekerjaan menyediakan data saat runtime dan informasi pemicu saat ini.
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");
}
}Mendaftarkan Quartz di ASP.NET Core
Gunakan AddQuartz untuk mengonfigurasi penjadwal dan AddQuartzHostedService untuk menjalankannya sebagai IHostedService. Pekerjaan dan pemicu dikonfigurasi dalam lambda.
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);Sintaks Ekspresi Cron
Quartz menggunakan ekspresi cron dengan 6 atau 7 bidang: seconds minutes hours day-of-month month day-of-week [year]. Cron Quartz sedikit berbeda dari cron Unix — detik berada di urutan pertama.
// 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 expressionsPemicu Sederhana
Untuk jadwal berbasis interval tanpa kerumitan cron, gunakan pemicu sederhana dengan WithSimpleSchedule.
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)));JobDataMap
Teruskan parameter saat runtime ke pekerjaan melalui JobDataMap. Akses parameter tersebut di dalam Execute melalui context.JobDetail.JobDataMap.
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] mencegah instans baru pekerjaan dimulai saat instans sebelumnya masih berjalan. Atribut ini penting untuk pekerjaan yang mengakses sumber daya bersama.
[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.Penanganan Pengecualian dan Percobaan Ulang
Bungkus kode pekerjaan dalam try/catch. Lempar JobExecutionException untuk memberi tahu Quartz agar menjalankan kembali pekerjaan segera atau setelah penundaan.
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
}
}Dunia Nyata: Penjadwal Banyak Pekerjaan
Penyiapan Quartz siap produksi dengan beberapa pekerjaan pada jadwal berbeda, semuanya menggunakan DI untuk layanan.
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 * * ?"));
});Pemeriksaan Singkat
Apa fungsi atribut [DisallowConcurrentExecution] pada pekerjaan Quartz.NET?
Ringkasan: Pekerjaan Terjadwal dengan Quartz.NET
Inti pembelajaran:
- Quartz.NET: penjadwal siap produksi dengan cron, persistensi, dan pengelompokan
- Definisikan pekerjaan dengan mengimplementasikan IJob dan metode Execute
- Daftarkan dengan AddQuartz + AddQuartzHostedService; pekerjaan mendukung DI
- Format cron: seconds minutes hours dom month dow — perhatikan bahwa detik berada di awal
[DisallowConcurrentExecution]: tunggu eksekusi saat ini selesai sebelum menjalankan kembali- Gunakan JobDataMap untuk meneruskan parameter saat runtime ke pekerjaan
Belajar C# dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 93
- Pelajaran
- 346
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pekerjaan Terjadwal Quartz.NET” gratis?
Ya — teks lengkap “Pekerjaan Terjadwal Quartz.NET” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pekerjaan Terjadwal Quartz.NET”?
Definisikan pekerjaan dan pemicu dengan Quartz.NET, gunakan ekspresi cron, dan integrasikan dengan DI ASP.NET Core. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C# Academy?
Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Pekerjaan Terjadwal Quartz.NET” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?
Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- IHostedService & BackgroundService
- Proyek Worker Service
- Tugas Berkala & Timer
- Pekerjaan Terjadwal Quartz.NET