MassTransit如何在队列关闭时处理启动/停止

时间:2016-12-13 15:09:53

标签: c# rabbitmq masstransit

我正在使用带有MasstTransit 3.2.0的RabbitMQ 3.6.0并将其配置如下:

// MassTransit
IBusControl bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
    var host = cfg.Host(new Uri(configuration.Url), h =>
    {
        h.Username(configuration.User.UserName);
        h.Password(configuration.User.Password);
    });

    cfg.UseXmlSerializer();

    cfg.ReceiveEndpoint(host, configuration.Queue, e =>
    {
    });
});

我从以下开始:

// start the bus
IBusControl bus = container.Resolve<IBusControl>();
bus.Start();

不幸的是,当RabbitMQ关闭时,这是我在架构中的一个场景,方法bus.Start()会挂起一段时间,直到它发生爆炸并抛出异常。 是否有我可以使用的替代模式,以便应用程序通过&#34; log&#34;队列已关闭,我可以稍后再尝试运行bus.Start()

1 个答案:

答案 0 :(得分:2)

无需手动重试bus.Start(),就像处理抛出的异常(RabbitMqConnectionException)一样,MassTransit(我们正在使用v3.5.5)将继续尝试建立RabbitMQ连接的背景。即使RabbitMQ仍然不可用,第二次调用bus.Start()也会成功。

在这种情况下,我们捕获bus.Start()上抛出的异常并对其进行评估以查看它是暂时的还是永久性的错误。如果它的永久性然后终止申请。如果是瞬态,那么我们启动应用程序,然后使用Polly重试在RabbitMQ离线时失败的任何重要bus.Publish() / bus.Send()调用。