Дополнительные статьи

Действия по расписанию и Quartz.NET

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 27.02.2018

Quartz.NET представляет открытый фреймворк для выполнения действий по расписанию в среде ASP.NET. Используем его в своем приложении. Для начала нам надо добавить Nuget-пакет, который называется по имени фреймворка:

Quartz.NET
Quartz.NET в ASP.NET MVC 5

Что надо для работы с 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();
        }
    }
}

И после старта приложения раз в минуту начнут отправляться письма.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850