2016-12-13 12 views
2

私は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を使用している)を扱うかのよう

+0

MassTransitに何かがあるかどうかはわかりませんが、私は再試行を続けます。あなたが何かをすることができない場合は、それが修正されるまで試してください。たぶん、長くても長い再試行間隔でさえ。 – Michael

+0

したがって、接続を試みている再帰的なパターンの一種、アプリケーションの起動をブロックしないように分離されたスレッドにあるかもしれませんか? メッセージコンシューマだけを持つアプリはどうですか? – Raffaeu

+1

RabbitMQがダウンした場合のシステムの反応の仕方によって異なります。あなたがアクションを取る必要がある(再起動する)場合、吹き付けが最良の方法かもしれません。ある時点でRabbitMQが修正された場合、再試行が最適な解決策になるかもしれません。また、アプリケーションが一定の試行回数だけ再試行してから吹き飛ばすようにすることもできます。私たちはRabbitMQも使用していますが、典型的なコンシューマを接続が中断してから、もう一度試してみることもあります。 – Michael

答えて

2

は、手動でbus.Start()を再試行する必要はありません。 bus.Start()を呼び出すと、RabbitMQが依然として利用できなくても、2度目は常に成功します。

このシナリオでは、bus.Start()にスローされた例外を捕捉し、一時的または永続的な障害であるかどうかを評価します。そのパーマネントがアプリケーションを終了する場合。一時的な場合は、アプリケーションを起動し、Pollyを使用して、RabbitMQがオフラインの間に失敗した重要なbus.Publish()/bus.Send()コールを再試行します。

関連する問題