如果消息代理关闭,是否有可能引发异常?

Is there a possibility to raise an exception if message broker is down?

我将 Masstransit 与 RabbitMQ、log4net 一起用于日志记录,一切正常。但是当 RabbitMQ 服务器关闭时,我注意到日志中充满了错误:

ERROR - RabbitMQ Connect Failed: Broker unreachable: 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();
    });                     
});

您需要按照文档中的描述使用观察器:

还有接收端点观察器,它没有记录但用于健康检查。

比如在健康检查中,我们这样使用bus observer:

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).

我还建议使用 health checks,因为这是确定您的服务是否健康的默认方式,而不仅仅是 RMQ。