Настроить задание на сбой с помощью Hangfire с ASP.NET?

У меня есть приложение ASP.NET, которое отправляет электронные письма всякий раз, когда пользователь регистрируется на веб-сайте. Я использую Hangfire для управления заданиями и почтой для отправки электронных писем.

Все отлично работает, но вот в чем дело:

Я хочу, чтобы суперпользователь изменил, сколько раз приложение может отправлять электронное письмо, прежде чем удалять задание.

Вот мой код

    public static void WelcomeUser(DBContexts.Notifications not)
    {
        try{
            var viewsPath = Path.GetFullPath(HostingEnvironment.MapPath(@"~/Views/Emails"));
            var engines = new ViewEngineCollection();
            engines.Add(new FileSystemRazorViewEngine(viewsPath));

            Postal.EmailService service = new Postal.EmailService(engines);

            WelcomeUserMail welcomeUserMail = new WelcomeUserMail();
            welcomeUserMail.To = not.ReceiverEmail;
            welcomeUserMail.UserEmail = not.ReceiverEmail;
            welcomeUserMail.From = BaseNotification.GetEmailFrom();

            service.Send(welcomeUserMail);
        }
        catch(Exception e)
        {
            DBContexts.DBModel dbModel = new DBModel();
            DBContexts.Notifications notificacionBD =  dbModel.Notifications.Find(not.NotificationID);

            notificacionBD.Status = false;
            notificacionBD.Timestamp = DateTime.Now;
            notificacionBD.Error = e.Message;

            int numberOfRetriesAllowed = ParameterHelper.getNumberOfRetriesAllowed();

            if (notificacionBD.Retries > numberOfRetriesAllowed)
            {
                //In this case Hangfire won't put this job in the failed section but rather in the processed section.
                dbModel.SaveChanges();
            }
            else
            {
                notificacionBD.Retries++;
                dbModel.SaveChanges();

                throw new Exception(e.Message);
            }
        }
    }

person ggderas    schedule 07.04.2016    source источник


Ответы (1)


Почему бы просто не добавить атрибуты для автоматической обработки?

[AutomaticRetry(Attempts = 10, LogEvents = true, OnAttemptsExceeded = AttemptsExceededAction.Delete)]
public void MyTask(){
    //doing stuff
}

Или вы могли бы просто создать свой собственный атрибут, имитирующий класс AutommaticRetryAttribute, но обращаться с ним так, как хотите?

https://github.com/HangfireIO/Hangfire/blob/a5761072f18ff4caa80910cda4652970cf52e693/src/Hangfire.Core/AutomaticRetryAttribute.cs

person Erick Smith    schedule 14.04.2016
comment
Ну, дело в том, что я хочу, чтобы суперпользователь мог изменить количество попыток. Вот почему я хочу справиться с этим по-своему. - person ggderas; 14.04.2016
comment
Верно. Вы можете создать свой собственный атрибут AutomaticRetry, просмотрев, как был создан AutomaticRetryAttribute, но, может быть, заменив его своими собственными условиями? - person Erick Smith; 14.04.2016