我正在使用带有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()
?
答案 0 :(得分:2)
无需手动重试bus.Start()
,就像处理抛出的异常(RabbitMqConnectionException
)一样,MassTransit(我们正在使用v3.5.5)将继续尝试建立RabbitMQ连接的背景。即使RabbitMQ仍然不可用,第二次调用bus.Start()
也会成功。
在这种情况下,我们捕获bus.Start()
上抛出的异常并对其进行评估以查看它是暂时的还是永久性的错误。如果它的永久性然后终止申请。如果是瞬态,那么我们启动应用程序,然后使用Polly重试在RabbitMQ离线时失败的任何重要bus.Publish()
/ bus.Send()
调用。