1

目前我有一个正在运行的 Windows 服务,它从队列(MSMQ)中读取消息。在收到来自队列的消息时,偶尔会抛出以下错误......(即在对放置在队列上的 4000 个事务运行测试时,异常被抛出两次......)

关于可能导致这种情况的任何建议?值得注意的是,队列与运行应用程序的服务器位于不同的服务器上。

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。 Messaging.XmlMessageFormatter.Read(Message message) at System.Messaging.Message.get_Body() at PTFMiddleware.Queues.QueueMessaging.Receive[T](MessageQueue queue, String& label, Nullable`1 timeout) at PTFMiddleware.ProcessCCHMessages.Worker.Job ()

亲切的问候,菲奥娜

4

1 回答 1

0

您的服务似乎需要 XML 数据,并在队列中找到一些不是 XML 的数据。从您引用的错误消息中可以清楚地看出这一点。根本原因在于数据生产者;要识别数据生产者,您需要识别队列中导致问题的特定消息。

在包含 4000 个事务的测试集中,使用二进制搜索技术将在少至 14 次测试运行中识别出有问题的消息之一:

  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 回答