MSMQ を使用してbyte
配列を転送しています。
フォーマッタはBinaryMessageFormatter
.
宛先キューはプライベート キューで、直接 TCP 通信を使用しています。
宛先マシンは別の LAN にあり、外部 IP アドレスでアクセスします。
着信 TCP 通信を実際の宛先マシンにルーティングするファイアウォールがあります (ポート転送)。
したがって、システムのアーキテクチャは次のようになります。
[ソース マシン] --> [宛先ファイアウォール] --> [宛先マシン]
このシステムを数か月使用していますが、すべてうまくいきました。
最近、ファイアウォールの障害が発生しました。
どうやら、これによりデータが破損したようです。
キューはトランザクション対応であり、MSMQ によると、メッセージは送信先のコンピューターに正常に配信されましたが、メッセージの内容は破損していました。
つまり、キューからメッセージを読み取るコードで例外が発生しました。
try
{
var message = queue.Receive(readTimeout, transaction);
if (message != null)
{
data = (byte[]) message.Body; // this line raises an exception
return true;
}
}
catch (Exception e)
{
Logger.Error("error reading queue", e);
}
キュー (一番上) からいくつかのメッセージを削除する必要がありましたが、その後、システムは正常に戻りました。
私の質問:
これを引き起こしたのがファイアウォールの障害だけであり、それがトランザクション キューであることを知っていると仮定すると、メッセージが配信されたと見なされるのはなぜでしょうか?
MSMQ は、トランザクション キューのデータの整合性を確保するために何らかのチェックサムを実行していませんか?