1

現在、キュー (MSMQ) からメッセージを読み取る Windows サービスを実行しています。キューからメッセージを受信すると、次のエラーが非常にまれにスローされます... (つまり、キューに配置された 4000 トランザクションでテストを実行すると、例外が 2 回スローされました...)

これを引き起こしている可能性のあるものについて何か提案はありますか? 注目すべきことは、アプリケーションが実行されている場所とは別のサーバーにキューがあることです。

20121011161348.899 Job() -> 例外 (XmlException) System.Xml.XmlException: ルート要素がありません。System.Xml.XmlTextReaderImpl.ThrowWithoutLineInfo(String res) で System.Xml.XmlTextReaderImpl.ParseDocumentContent() で System.Xml.XmlReader.MoveToContent() で System.Xml.XmlReader.IsStartElement(String localname, String ns) で System. PTFMiddleware.Queues.QueueMessaging.Receive[T](MessageQueue キュー、文字列 & ラベル、Nullable`1 タイムアウト) の System.Messaging.Message.get_Body() で Messaging.XmlMessageFormatter.Read (メッセージ メッセージ) を PTFMiddleware.ProcessCCHMessages.Worker.Job で()

敬具、フィオナ

4

1 に答える 1

0

サービスは XML データを予期しているように見えますが、XML ではないデータをキューで見つけているようです。あなたが引用したエラーメッセージからそれは明らかです。根本的な原因はデータ プロデューサーにあります。データ プロデューサーを特定するには、問題の原因となっているキュー内の特定のメッセージを特定する必要があります。

4000 件のトランザクションのテスト セットでは、バイナリ検索手法を使用すると、わずか 14 回のテスト実行で問題のあるメッセージの 1 つを特定できます。

  1. $low を 1、$high を 2000、$altlo を 2001、$althi を 4000 に設定します。
  2. $low から $high までのトランザクションをテストします。
  3. エラーが報告されない場合 (問題はデータ セットの残りの半分にあります)、$low を $altlo に、$high を $althi に設定します。偏執的で用心深いと感じている場合は、テストを再実行して、このデータ セットでエラーが発生することを確認してください。
  4. $low = $high の場合、示されたポジションでのトランザクションはエラーです。
  5. $althi を $high、$high を (($low + $high) / 2)、$altlo を $high + 1、$low を $low に設定し、ステップ 2 に進みます。

問題のあるメッセージを見つけたら、メッセージの送信元と問題の性質を調べます。生成される XML には、複数の最も外側の要素が存在する可能性があります。包含要素がまったくない可能性があります。壊れたデータ ソースを見つけます。修理。

于 2012-10-11T16:35:42.710 に答える