Есть ли возможность вызвать исключение, если брокер сообщений не работает?

Я использую Masstransit с RabbitMQ, log4net для ведения журнала, и все работает нормально. Но когда сервер RabbitMQ не работает, я заметил, что журнал заполнен ошибками:

ОШИБКА - RabbitMQ Connect не удалось: брокер недоступен: localhost: 5672 /

Но по-прежнему можно публиковать сообщения без ограничений. Похоже, такие сообщения отправляются, а затем исчезают.

Есть ли возможность создавать такие исключения и обрабатывать их вручную? Или я мог каким-то образом заставить метод Publish выдать Exception, если брокер не работает?

Ниже представлена ​​настройка моей шины:

var busControl = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
    var host = cfg.Host(new Uri("rabbitmq://localhost/"), h =>
        { });
        cfg.UseLog4Net();
        cfg.ReceiveEndpoint("test-queue", ep =>
    {
        ep.StateMachineSaga(context.Resolve<ProductSaga>(),
        context.Resolve<ILifetimeScope>());
        if (ep is IRabbitMqReceiveEndpointConfigurator)
        {
        ((IRabbitMqReceiveEndpointConfigurator)ep).PrefetchCount = 8;
        }
        ep.UseInMemoryOutbox();
    });                     
});

person Maksim Alkhovik    schedule 30.08.2019    source источник
comment
Публикация вызовет исключение, если брокер не работает.   -  person Chris Patterson    schedule 30.08.2019
comment
Нет, не будет. Это проблема.   -  person Maksim Alkhovik    schedule 02.09.2019
comment
Вы звонили .StartAsync() в автобусе перед тем, как позвонить в publish?   -  person Chris Patterson    schedule 02.09.2019


Ответы (1)


Для этого вам нужно использовать наблюдателей, как описано в документации:

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

Например, при проверках работоспособности мы используем обозреватель шины следующим образом:

public class ReceiveEndpointHealthCheck :
    IReceiveEndpointObserver
{
     // some more stuff

    public Task Faulted(ReceiveEndpointFaulted faulted)
    {
        var endpoint = GetEndpoint(faulted.InputAddress);

        endpoint.Ready = false;
        endpoint.LastException = faulted.Exception;

        return TaskUtil.Completed;
    }
}

Вы можете создать экземпляр такого наблюдателя, а затем вызвать bus.ConnectReceiveEndpointObserver(receiveEndpointCheck).

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

person Alexey Zimarev    schedule 30.08.2019