2013-04-15 86 views
36

背景:

我排除問題,其中通過WCF在交易MSMQ發送(與netMsmqBinding)消息似乎消失了。使用WCF的代碼位於我無法更改的第三方程序集中。我幾乎沒有什麼線索來解決問題,但計劃啓用各種跟蹤功能,以便確定問題所在。歸屬關係MSMQ端至端跟蹤與WCF跟蹤和應用級日誌

語境:

  1. 我已經啓用MSMQ End-to-End Tracing。它爲發送的每條消息記錄兩個事件。

    • 將消息寫入傳出隊列時的一個事件。此消息包含MSMQ消息ID(由guid和整數組成,即7B476ADF-DEFD-49F2-AF5A-0CF27C5152C0 \ 6481271)。
    • 該消息通過網絡發送時的另一個事件。
  2. 我已啓用詳細WCF Tracing

  3. 我也有應用程序級別的日誌記錄,記錄應用程序代碼定義的消息ID(我們稱之爲「應用程序消息ID」)。

  4. 我在發送的MSMQ消息上啓用了正面和負面源日誌記錄。

  5. 我已在接收隊列上啓用日記功能。

問題:

當消息就消失了,我知道缺少的消息的應用程序ID(它是由發送端登錄)。我現在想看看端到端跟蹤,看看 消息是否寫入了傳出隊列。

如何關聯端到端跟蹤中的事件與應用程序級日誌和WCF跟蹤?

想法:

  • 發送時使用System.Messaging託管MSMQ API一個MSMQ消息,發送消息後,消息的MSMQ ID是可用的。但是,在WCF執行發送操作時,我還沒有找到記錄此方法的方法。 WCF跟蹤記錄了一個MSMQMessageId guid,但是這個值令人驚訝的不像我猜測的那樣是實際的MSMQ id。 是否可以訪問實際的MSMQ消息ID並記錄它?

  • 在應用程序日誌中記錄本機線程ID以及應用程序級別ID和時間戳。本地線程ID由MSMQ記錄到端到端跟蹤,因此這可能實際上足以進行關聯。如果我沒有找到更優雅的解決方案,這對我來說就是B計劃。

+1

你檢查了[死信](http://msdn.microsoft.com/en-us/library/ms789035.aspx)隊列嗎? –

+1

是的,我做過了。它是空的。 –

+0

我喜歡使用perfmon來幫助跟蹤消息的生命週期。隊列計數器,系統計數器等應該能夠看到各種傳出隊列和目標隊列隨着消息流經它們而上下移動。缺少多少條消息? –

回答

0

您可以配置windows MSMQ來感知消息的主題,以及主題是否包含關鍵詞激發應用程序。此應用程序可以記錄傳入消息。在發件人一方,您可以將實際的消息編號寫入消息主題,並將關鍵字添加到主題。在接收者側的應用程序可以訪問實際消息ID附近的主題添加關鍵字。

1

你聽起來像你在正確的軌道上。但是你可以碰了一下這個:

使用SvcConfigEditor.exe

  1. 配置WCF詳細跟蹤的傳播ACtiveity和活動跟蹤
  2. 配置WCF MessageLogging爲「畸形消息,服務信息,交通信息「

WCF 1

使用LogEntireMessage

WCF 3

在端到端,跟蹤它的所有 WCF 2

確保你讓這些*兩側的.config,你和第三方可執行文件。

收集你的日誌文件,並將它們都添加到SvcTraceViewer.exe

0

它看起來像你的消息是由WCF丟棄,因爲它以某種方式(如合同不匹配,的WCF郵件大小限制一個畸形超標)。

要捕獲此錯誤,您可以編寫一個ErrorHanlder來審計這些錯誤。 這裏有一個link來做一個樣本。

如果您使用的是Win 2008 R2或更高版本,另一種選擇是使用內置的毒害消息處理。這裏的文檔是link

向該問題,跟蹤端到端與應用蹤跡標識符: 我將通過應用程序跟蹤ID在消息報頭(look here for an example)。

要審覈服務端的消息頭,我會使用WCF的IOperationInvoker來截獲每個調用,並審覈消息頭中的id。

這可以在過程的配置文件中進行配置,而無需更改第三方代碼。 here`s如何實現調用者以及如何在配置中設置它的示例。