Что такое библиотека Quartz.NET?

«Что такое библиотека Quartz.NET?» — вопрос из категории Архитектура, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Quartz.NET — это полнофункциональная, open-source библиотека для планирования заданий (job scheduling) в приложениях .NET. Она позволяет выполнять задачи (jobs) по сложному расписанию, например, в определенное время, с периодичностью или по Cron-выражениям.

Ключевые компоненты и возможности:

  • Scheduler (Планировщик): Центральный компонент для управления выполнением заданий.
  • Job (Задание): Логическая задача, которую нужно выполнить. Реализует интерфейс IJob.
  • Trigger (Триггер): Определяет когда должно выполняться задание (например, "каждые 30 секунд", "в 2:00 каждый день").
  • JobStore (Хранилище): Поддерживает персистентность (сохранение заданий и триггеров в БД, например, SQL Server, PostgreSQL), что критично для кластерных конфигураций и перезапусков приложения.
  • Кластеризация: Поддержка отказоустойчивых кластеров, где выполнение задания гарантированно происходит только на одном узле.

Типичный сценарий использования — фоновый сервис для отправки отчетов:

// 1. Определяем задание
public class DailyReportJob : IJob
{
    public async Task Execute(IJobExecutionContext context)
    {
        var reportData = await _reportService.GenerateDailyReportAsync();
        await _emailService.SendReportAsync(reportData);
        // Данные можно передавать через JobDataMap в context.JobDetail
    }
}

// 2. Настраиваем и запускаем планировщик (обычно в Program.cs или Startup)
public static async Task ScheduleJobs(IServiceProvider serviceProvider)
{
    var schedulerFactory = new StdSchedulerFactory();
    var scheduler = await schedulerFactory.GetScheduler();
    scheduler.JobFactory = new MyJobFactory(serviceProvider); // Для DI
    await scheduler.Start();

    // 3. Создаем задание и триггер
    var job = JobBuilder.Create<DailyReportJob>()
        .WithIdentity("dailyReport", "reports")
        .Build();

    // Триггер, который срабатывает каждый день в 8:00 утра
    var trigger = TriggerBuilder.Create()
        .WithIdentity("dailyTrigger", "reports")
        .StartNow()
        .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(8, 0))
        .Build();

    // 4. Планируем выполнение
    await scheduler.ScheduleJob(job, trigger);
}

Почему выбирают Quartz.NET? Для сложных расписаний, требующих персистентности, кластеризации и надежности. Для простых периодических задач в ASP.NET Core можно рассмотреть BackgroundService или IHostedService.