私はMasstTransit 3.2.0とRabbitMQの3.6.0を使用して、次のようにそれを設定していたときスタート/ストップの処理方法:MassTransitは、キューがダウン
// 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()
を実行することができますか?あなたがバックグラウンドでRabbitMQの接続を確立しようとし続けますスローされた例外(RabbitMqConnectionException
)、MassTransitを(我々はv3.5.5を使用している)を扱うかのよう
MassTransitに何かがあるかどうかはわかりませんが、私は再試行を続けます。あなたが何かをすることができない場合は、それが修正されるまで試してください。たぶん、長くても長い再試行間隔でさえ。 – Michael
したがって、接続を試みている再帰的なパターンの一種、アプリケーションの起動をブロックしないように分離されたスレッドにあるかもしれませんか? メッセージコンシューマだけを持つアプリはどうですか? – Raffaeu
RabbitMQがダウンした場合のシステムの反応の仕方によって異なります。あなたがアクションを取る必要がある(再起動する)場合、吹き付けが最良の方法かもしれません。ある時点でRabbitMQが修正された場合、再試行が最適な解決策になるかもしれません。また、アプリケーションが一定の試行回数だけ再試行してから吹き飛ばすようにすることもできます。私たちはRabbitMQも使用していますが、典型的なコンシューマを接続が中断してから、もう一度試してみることもあります。 – Michael