Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Quartz.NET представляет открытый фреймворк для выполнения действий по расписанию в среде ASP.NET. Используем его в своем приложении. Для начала нам надо добавить Nuget-пакет, который называется по имени фреймворка:
Quartz.NET
Что надо для работы с Quartz.NET? Надо, во-первых, определить работу, которая будет выполняться. И, во-вторых, надо определить триггер, который будет управлять выполнением работы, запускать ее, конфигурировать.
Итак, добавим в проект новую папку, которую назовем Jobs. В эту папку добавим новый класс EmailSender, который будет представлять работу - рассылку электронной почты. Этот класс будет выглядеть следующим образом:
using Quartz; using System.Net; using System.Net.Mail; using System.Threading.Tasks; namespace QuartzApp.Jobs { public class EmailSender : IJob { public async Task Execute(IJobExecutionContext context) { using (MailMessage message = new MailMessage("admin@yandex.ru", "user@yandex.ru")) { message.Subject = "Новостная рассылка"; message.Body = "Новости сайта: бла бла бла"; using (SmtpClient client = new SmtpClient { EnableSsl = true, Host = "smtp.yandex.ru", Port = 25, Credentials = new NetworkCredential("admin@yandex.ru", "password") }) { await client.SendMailAsync(message); } } } } }
Класс работы должен реализовать интерфейс IJob, который определяет метод Execute()
, собственно выполняющий некоторую работу.
В данном случае в этом методе происходит отправка с электронного ящика некоторого виртуального администратора с email admin@yandex на email
виртуального пользователя user@yandex.ru.
В зависимости от почтового сервера настройки объекта SmtpClient, который отправляет письмо, могут различаться.
Далее также добавим в эту папку Jobs новый класс EmailSheduler, который будет запускать работу:
using Quartz; using Quartz.Impl; namespace QuartzApp.Jobs { public class EmailScheduler { public static async void Start() { IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler(); await scheduler.Start(); IJobDetail job = JobBuilder.Create<EmailSender>().Build(); ITrigger trigger = TriggerBuilder.Create() // создаем триггер .WithIdentity("trigger1", "group1") // идентифицируем триггер с именем и группой .StartNow() // запуск сразу после начала выполнения .WithSimpleSchedule(x => x // настраиваем выполнение действия .WithIntervalInMinutes(1) // через 1 минуту .RepeatForever()) // бесконечное повторение .Build(); // создаем триггер await scheduler.ScheduleJob(job, trigger); // начинаем выполнение работы } } }
В статическом методе Start()
вначале создаем объект расписания IScheduler и запускаем его вызовом scheduler.Start()
.
Затем создаем саму работу, которая будет выполняться в виде объекта IJobDetail.
Следующим шагом идет создание и конфигурация триггера, который запускает работу. Здесь возможны различные опции. Но в данном случае указывается, что триггер будет называться "trigger1" (произвольное название) и будет принадлежать к группе "group1". Он будет запускать работу сразу после начала выполнения и будет выполнять ее раз в минуту. То есть пользователю будут раз в минуту приходить письма от администратора. И эти действия будут повторяться бесконечно.
И в конце происходит запуск всего действия:
scheduler.ScheduleJob(job, trigger);
Несколько слов по поводу возможных настроек отправки. Вместо минутного интервала выполнения мы можем задать еще ряд других:
WithInterval(milliseconds)
: интервал выполнения в миллисекундах
WithIntervalInSeconds(seconds)
: интервал в секундах
WithIntervalInHours(hours)
: интервал в часах
WithRepeatCount(number)
: определяет количество повторов
Момент запуска, который задается в триггере вызовом StartNow()
, также имеет различные варианты:
StartNow()
: запуск сразу же после начала выполнения
StartAt()
: определяет время, когда триггер начинает запускать работу
EndAt
: определяет время, когда триггер перестает запускать работу
И чтобы работа начала выполняться по расписанию со стартом приложения, изменим класс Global.asax.cs:
using System.Web.Mvc; using System.Web.Optimization; using System.Web.Routing; using QuartzApp.Jobs; // пространство имен работы и триггера namespace QuartzApp { public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); // запуск выполнения работы EmailScheduler.Start(); } } }
И после старта приложения раз в минуту начнут отправляться письма.