Я настроил mediatR для запуска событий с использованием Hangfire просто так:
public static class MediatRExtension
{
public static void Enqueue(this IMediator mediator, INotification @event)
{
BackgroundJob.Enqueue<HangfireMediator>(m => m.PublishEvent(@event));
}
}
public class HangfireMediator
{
private readonly IMediator _mediator;
public HangfireMediator(IMediator mediator)
{
_mediator = mediator;
}
public void PublishEvent(INotification @event)
{
_mediator.Publish(@event);
}
}
И еще несколько настроек для начала:
public static IGlobalConfiguration UseMediatR(this IGlobalConfiguration config, IMediator mediator)
{
config.UseActivator(new MediatRJobActivator(mediator));
config.UseSerializerSettings(new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects
});
return config;
}
public class MediatRJobActivator : JobActivator
{
private readonly IMediator _mediator;
public MediatRJobActivator(IMediator mediator)
{
_mediator = mediator;
}
public override object ActivateJob(Type type)
{
return new HangfireMediator(_mediator);
}
}
А теперь то, что я называю своей конечной точкой API, называется:
_mediator.Enqueue(@event);
return Ok();
Проблема в том, что в EventHandler (из mediatr) я выкидываю исключение. В панели мониторинга Hangfire это задание находится на вкладке Успешно, как показано ниже
Как я могу сказать Hangfire обработать это исключение и повторить задание еще раз? Эта работа должна быть Неудачной / Запланированной. Но это исключение в обработчике событий mediatr выглядит так, как будто исключение не говорит об этом в Hangfire ...