Исключение обработки, выданное в событии MediatR, выполнялось как задание на зависание - PullRequest
1 голос
/ 04 июля 2019

Я настроил 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 это задание находится на вкладке Успешно, как показано ниже

enter image description here

Как я могу сказать Hangfire обработать это исключение и повторить задание еще раз? Эта работа должна быть Неудачной / Запланированной. Но это исключение в обработчике событий mediatr выглядит так, как будто исключение не говорит об этом в Hangfire ...

1 Ответ

0 голосов
/ 04 июля 2019

Я обнаружил, что Wait() является решением:

    public void PublishEvent(INotification @event)
    {
        _mediator.Publish(@event).Wait();
    }

Но я понятия не имею, почему ...

...