我将 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/