私は、接続を取得するたびに MQ サーバーへの接続を試行し続ける必要があるシステムを設計中です。
デフォルトでは、MQ が使用できない場合、例外が発生します。接続を取得するまで、どうすれば同じメソッドを何度も呼び出すことができますか。再帰を使用できることはわかっていますが、それを行うより良い方法はありますか。無限ループを避けたいからです。また、接続が得られるまで、さらなる処理を待ちたいと思います。
C# で .net 2.0 を使用しています。窓口サービスアプリです。
私は、接続を取得するたびに MQ サーバーへの接続を試行し続ける必要があるシステムを設計中です。
デフォルトでは、MQ が使用できない場合、例外が発生します。接続を取得するまで、どうすれば同じメソッドを何度も呼び出すことができますか。再帰を使用できることはわかっていますが、それを行うより良い方法はありますか。無限ループを避けたいからです。また、接続が得られるまで、さらなる処理を待ちたいと思います。
C# で .net 2.0 を使用しています。窓口サービスアプリです。
基本的な構造は次のとおりです。
while(true)
{
try
{
// attempt connection
break; // Will only get here if an exception was not thrown
}
catch
{
// Logging, sleep statement
}
}
接続が確立できないかどうかを確認する方法がある場合 (例外がスローされている場合を除く)、それを使用してください。フロー制御に例外を使用するべきではありません。私が示した例は極端な場合のものです。
ループが無限になるのを避けるために、カウントを追加することができます (たとえば、10 回だけ試行します)。
私の見方では、ループは無限でなければなりません。サーバーが 45 分間ダウンしていたためにサービスを再起動しなければならない人になりたいですか?
const int attempts = 3;
const int perAttemptSleep = 5000;
const int perTrialSleep = 600000;
while (true)
{
for (var i = 0; i < attempts; i++)
{
try
{
Connect();
return;
}
catch (ConnectException)
{
Thread.Sleep(perAttemptSleep);
}
}
Log();
Thread.Sleep(perTrialSleep);
}
すでに提供されているコードサンプルを使用すると、必要なループが発生するため、そのアドバイスを複製することはしません。ただし、いくつかの提案があります。
WMQ v7.0の.Net機能は、WMQv6よりもはるかに優れています。使用可能なオプションの中には、クライアントの再接続を完全にチャネル構成で処理できるというものがあります。v6は2011年9月の時点でサポートが終了しており、これは新しいアプリケーションであるため、WMQv7クライアントを使用することを強くお勧めします。v6 QMgrで使用できますが、v7のすべての機能を利用できるわけではありません。できれば、v7 QMgrも使用できます。そうすれば、構成可能なオプションとして再接続動作を取得できます。現在v6を使用している場合、IBMからのサポートを利用できるようにするには、今後18か月以内にv7にアップグレードする必要があります。
IBM-MQC7:WebSphereMQV7.0クライアントhttp://bit.ly/bXM0q3
再接続ロジックのコーディングを続行すると仮定すると、再接続の試行の間に、少なくとも1秒間、できれば数秒間スリープする必要があります。そうしないと、WMQリスナーがフラッディングし、非常に効果的なサービス拒否攻撃が実行されます。
ログメッセージには必ずWMQ理由コードを含めてください。たとえば、メッセージをキューに入れて2053 MQRC_Q_FULLを取り戻そうとしている場合、これは通常、高速プロデューサー/低速コンシューマーの問題によって引き起こされる一時的なエラーです。しかし、2035 MQRC_AUTHORIZATION_ERRORが戻った場合、人間の介入なしにプログラムが回復する可能性はありません。ログに記録されたメッセージにWMQ理由コードがない場合、トランスポート層でのエラーの根本原因を判別することは非常に困難です。