2016-05-25 3 views
4

В настоящее время я работаю над модулем EmailNotification, в котором я начал использовать hangfire. Единственная проблема заключается в том, что после 10 попыток, если hangfire не выполнит (запланировать задание) электронную почту в моем случае, я не могу найти, чтобы получать обновления по этому поводу через код.Как получить доступ к Failed Hangfire Jobs

Я знаю, что на самом деле, я могу получить доступ к замедленному воспламенению - панель управления конфигурированием замедленного воспламенения, как показано ниже:

public void ConfigureHangfire(IAppBuilder app) 
{ 
    var container = AutofacConfig.RegisterBackgroundJobComponents(); 
    var sqlOptions = new SqlServerStorageOptions 
    { 
     PrepareSchemaIfNecessary = Config.CreateHangfireSchema 
    }; 
    Hangfire.GlobalConfiguration.Configuration.UseSqlServerStorage("hangfire", sqlOptions); 
    Hangfire.GlobalConfiguration.Configuration.UseAutofacActivator(container); 
    var options = new BackgroundJobServerOptions() {Queues = new[] {"emails"}}; 
    app.UseHangfireDashboard(); 
    app.UseHangfireServer(options); 
} 

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

+0

Попробуйте здесь: http://docs.hangfire.io/en/latest/background-processing/dealing-with-exceptions.html Ищите «Можем ли мы создать собственный обработчик исключений». Может быть, это поможет. я не сделал этого ответа, потому что я не уверен. –

+0

Логика для доступа к неудавшимся заданиям на основе пользовательского исключения, я не уверен, нравится ли мне эта идея. Тем не менее, я смотрю на него - если я найду что-то удобное - обновится здесь - Спасибо! – vran

ответ

4

Для этого вы можете использовать Hangfire Job Filters. Фильтр заданий позволяет расширить функциональность замедленного воспламенения, и вы можете сделать много interesing вещи с ними (см официальной документации here для более подробной информации)

Создать класс, который наследуется от JobFilterAttribute

И Реализовать IElectStateFilter интерфейс. Этот интерфейс предоставляет вам метод, OnStateElection, который вызывается, когда текущее состояние задания изменяется на указанное состояние кандидата, например FailedState.

public class MyCustomFiler : JobFilterAttribute, IElectStateFilter 
{ 
    public void IElectStateFilter.OnStateElection(ElectStateContext context) 
    { 
     var failedState = context.CandidateState as FailedState; 
     if (failedState != null) 
     { 
      //Job has failed 
      //Job ID => context.BackgroundJob.Id, 
      //Exception => failedState.Exception 
     } 
    } 
} 

И затем, зарегистрировать этот атрибут -

GlobalJobFilters.Filters.Add(new MyCustomFiler()); 

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

+0

Спасибо - это сработало! Единственное, что это async, поэтому я не буду сразу знать, что показывать в пользовательском интерфейсе - но я думаю, на данный момент я просто использую три разных состояния, например: IN PROGRESS - FINISHED - FAILED - пока не получу подтверждение завершенного или неудачного , я просто использую IN PROGRESS в качестве статуса для этой работы !! – vran

 Смежные вопросы

  • Нет связанных вопросов^_^