我将 RabbitMQ 3.6.0 与 MasstTransit 3.2.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() 方法会挂起一段时间,直到它爆炸并抛出异常。
是否有我可以使用的替代模式,以便应用程序通过“日志”通知队列已关闭,我可以稍后尝试运行 bus.Start()

最佳答案

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

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

关于c# - MassTransit 如何在队列关闭时处理启动/停止,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41124403/

10-12 02:07