'本地msmq消息池已满且#39;跟踪消息意味着什

时间:2015-03-06 09:26:36

标签: wcf c#-4.0 msmq svctraceviewer

我一直在使用SvcTraceViewer.exe跟踪消息,这些消息是使用c#应用程序通过MSMQ传输的,并且遇到了一个我不理解的信息事件。

原始XML看起来像这样:

<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent">
  <System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system">
    <EventID>262242</EventID>
    <Type>3</Type>
    <SubType Name="Information">0</SubType>
    <Level>8</Level>
    <TimeCreated SystemTime="2015-03-02T14:54:57.3176368Z" />
    <Source Name="System.ServiceModel" />
    <Correlation ActivityID="{f6fa4c52-6372-45ce-9171-1c5d789c3bf0}" />
    <Execution ProcessName="MYPROCESS.EXE" ProcessID="12492" ThreadID="5" />
    <Channel />
    <Computer>MYCOMPUTER</Computer>
  </System>
  <ApplicationData>
    <TraceData>
     <DataItem>
        <TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Information">
          <TraceIdentifier>http://msdn.microsoft.com/en-GB/library/System.ServiceModel.Channels.MsmqPoolFull.aspx</TraceIdentifier>
          <Description>Pool of the native MSMQ messages is full. This may affect performance.</Description>
          <AppDomain>ASM.Sequoia.Reporting.ReportGenerator.exe</AppDomain>
        </TraceRecord>
      </DataItem>
    </TraceData>
  </ApplicationData>
</E2ETraceEvent>

消息'本机MSMQ消息池已满。这可能会影响性能。'很明显,但我找不到任何有意义的信息。

快速谷歌之后,我遇到了以下链接 - 没有一个真正帮助我理解这个日志告诉我的内容,尽管第一个说它可以被忽略。由于博客是从8年前开始的,我想我会问,因为我不知道这些信息是否仍然是最新的。

http://blogs.msdn.com/b/drnick/archive/2007/03/06/the-pool-is-full.aspx(说要忽略这些信息 - 但是从8年前开始)

https://msdn.microsoft.com/en-us/library/aa738731(v=vs.110).aspx(MSDN帖子不是很有帮助?!)

有关信息,我使用非事务性队列,没有排队的消息(卡在队列或处理中),死信队列中没有任何内容...我通过队列发送的信息很大 - 可以是最多可达几MB,因为它包含一堆序列化图像。

有谁知道这意味着什么?

1 个答案:

答案 0 :(得分:1)

我认为这个消息无需担心。我看了一下WCF源代码,发现当一些内部对象池已满时,它只是诊断消息。他们使用池来重用MsmqInputMessage个对象。当游泳池已满时,他们只是将该物体留给垃圾收集。当池为空时,它们似乎也跟踪相同的消息,在这种情况下,它们只是在发生这种情况时创建新对象。所以一切都在这些日志消息之后正常工作,尽管有点不太理想,即会创建一些额外的对象并进行垃圾回收。

顺便说一下。您可以在线浏览.Net源代码或下载它并在VS中打开一些子项目。就在这里:

http://referencesource.microsoft.com/

以下是您的问题的一些有趣文件: http://referencesource.microsoft.com/#System.ServiceModel/System/ServiceModel/Channels/MsmqInputMessagePool.cs http://referencesource.microsoft.com/#System.ServiceModel/System/ServiceModel/Channels/MsmqOutputChannel.cs

您可以搜索调用MsmqDiagnostics.PoolFull方法的位置。