【问题标题】:Is there a possibility to raise an exception if message broker is down?如果消息代理关闭,是否有可能引发异常?
【发布时间】:2019-08-30 15:06:19
【问题描述】:

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

错误 - RabbitMQ 连接失败:代理无法访问: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();
    });                     
});

【问题讨论】:

  • 如果 broker 宕机,Publish 会抛出异常。
  • 不,不会。这就是问题所在。
  • 在调用 publish 之前,你在公交车上给 .StartAsync() 打电话了吗?

标签: c# rabbitmq masstransit


【解决方案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)

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

【讨论】:

    猜你喜欢
    • 2019-02-10
    • 1970-01-01
    • 2011-01-27
    • 2012-11-07
    • 2019-06-18
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多