Ответ
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.