Tâches planifiées avec Quartz.NET
Définissez des tâches et des déclencheurs avec Quartz.NET, utilisez des expressions cron et intégrez le tout à la DI d’ASP.NET Core.
Tâches planifiées avec Quartz.NET est une leçon C# Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C# Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C# Academy comprend 4 leçons au total.
Pourquoi Quartz.NET ?
Lorsque vous avez besoin d’expressions cron, de la persistance des tâches, de la mise en grappe, de politiques de nouvelle tentative et de chaînes de tâches, Quartz.NET fournit un ordonnanceur de niveau production qui va au-delà de ce que propose PeriodicTimer. Il s’agit du portage .NET de l’ordonnanceur Java Quartz populaire.
Installer Quartz.NET
Ajoutez les packages Quartz et Quartz.AspNetCore. L’intégration ASP.NET enregistre automatiquement l’ordonnanceur en tant que service hébergé.
# 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.PluginsDéfinir une tâche
Implémentez IJob (ou IAsyncJob dans les versions récentes de Quartz) avec une méthode Execute. Le contexte de la tâche fournit les données d’exécution et les informations sur le déclencheur actuel.
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");
}
}Enregistrer Quartz dans ASP.NET Core
Utilisez AddQuartz pour configurer l’ordonnanceur et AddQuartzHostedService pour l’exécuter en tant que IHostedService. Les tâches et les déclencheurs sont configurés dans la fonction 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);Syntaxe des expressions cron
Quartz utilise une expression cron à 6 ou 7 champs : seconds minutes hours day-of-month month day-of-week [year]. Le cron de Quartz diffère légèrement de celui d’Unix : les secondes viennent en premier.
// 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 expressionsDéclencheurs simples
Pour les planifications fondées sur des intervalles sans la complexité de cron, utilisez des déclencheurs simples avec 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)));Map de données de tâche
Transmettez les paramètres d’exécution aux tâches via JobDataMap. Accédez-y dans Execute par l’intermédiaire de 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] empêche le démarrage d’une nouvelle instance de la tâche tant que la précédente est encore en cours d’exécution. C’est essentiel pour les tâches qui accèdent à des ressources partagées.
[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.Gestion des exceptions et nouvelles tentatives
Entourez le code de la tâche d’un bloc try/catch. Lancez JobExecutionException pour demander à Quartz de relancer immédiatement la tâche ou après un délai.
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
}
}Cas réel : ordonnanceur multi-tâches
Une configuration Quartz de production avec plusieurs tâches exécutées selon des planifications différentes, qui utilisent toutes DI pour leurs services.
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 * * ?"));
});Vérification rapide
Que fait l’attribut [DisallowConcurrentExecution] sur une tâche Quartz.NET ?
Récapitulatif : tâches planifiées avec Quartz.NET
Points essentiels :
- Quartz.NET : ordonnanceur de niveau production avec cron, persistance et mise en grappe
- Définissez les tâches en implémentant IJob avec une méthode Execute
- Enregistrez-les avec AddQuartz + AddQuartzHostedService ; les tâches prennent en charge l’injection de dépendances
- Format cron : secondes minutes heures jour du mois mois jour de la semaine — notez que les secondes viennent en premier
[DisallowConcurrentExecution]: attendez la fin de l’exécution actuelle avant une nouvelle relance- Utilisez JobDataMap pour transmettre des paramètres d’exécution aux tâches
Apprends C# avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 93
- Leçons
- 346
Questions Fréquemment Posées
La leçon « Tâches planifiées avec Quartz.NET » est-elle gratuite ?
Oui — le texte complet de « Tâches planifiées avec Quartz.NET » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C# Academy, passe à CoddyKit PRO. Le cours C# Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Tâches planifiées avec Quartz.NET » ?
Définissez des tâches et des déclencheurs avec Quartz.NET, utilisez des expressions cron et intégrez le tout à la DI d’ASP.NET Core. Tu pratiques C# Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer C# Academy ?
Aucune expérience préalable n'est requise. C# Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « Tâches planifiées avec Quartz.NET » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon C# Academy ?
Oui. Chaque leçon C# Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- IHostedService et BackgroundService
- Projets Worker Service
- Tâches périodiques et minuteurs
- Tâches planifiées avec Quartz.NET