2009-01-26 64 views
4

怪之一,當得到復位。我們有一個多線程應用程序,它將消息從MSMQ隊列中提取出來,然後根據消息執行操作。所有這些都是使用DTC完成的。MessageReadPropertyFilter使用MSMQ

有時候,由於某種原因,我無法用語言形容,我們得到的消息拉從隊列消息時讀取錯誤。

是在應用程序正在使用的代碼:

Message[] allMessagesOnQueue = this.messageQueue.GetAllMessages(); 

foreach (Message currentMessage in allMessagesOnQueue) 
{ 
    if ((currentMessage.Body is IAMessageIDealWith)) 
    { 
       // do something;  
    } 
} 

當currentMessage.Body被訪問時,有時它拋出異常:

System.InvalidOperationException:屬性機構未檢索時接收消息。確保PropertyFilter設置正確。

現在 - 這只是發生在某些時候 - 它看起來好像在隊列中的MessageReadPropertyFilter有身體屬性設置爲false。

至於它是如何得到這樣一個有點神祕。 Body屬性是默認值之一,我們absolutley從不明確地將其設置爲false。

有其他人看到這種behaivour的或有一些想法,爲什麼這個值是越來越設置爲假?

回答

3

我已經看到了爲好,並試圖與我訪問明確設置的屬性初始化它,而不是將它們設置其他地方。我週期性地得到了同樣的錯誤,我的應用程序也是多線程的,我最終做的是捕獲該錯誤,並在我得到它時重新連接到MSMQ。

6

如前所述,您可以通過MessageReadPropertyFilter屬性明確設置可在messageQueue對象上訪問的System.Messaging.MessagePropertyFilter對象上的布爾值。

如果你想收到或見頂時,必須從消息中提取的所有數據,使用:

this.messageQueue.MessageReadPropertyFilter.SetAll(); // add this line 
Message[] allMessagesOnQueue = this.messageQueue.GetAllMessages(); 
// ... 

所以如果你想只是一些額外的屬性這可能會傷害讀取許多消息性能,創建一個新的MessagePropertyFilter自定義標記:

// Specify to retrieve selected properties. 
MessagePropertyFilter filter= new MessagePropertyFilter(); 
filter.ClearAll(); 
filter.Body = true; 
filter.Priority = true; 
this.messageQueue.MessageReadPropertyFilter = filter; 
Message[] allMessagesOnQueue = this.messageQueue.GetAllMessages(); 
// ... 

您還可以將其設置回用默認:

this.messageQueue.MessageReadPropertyFilter.SetDefaults(); 

此處瞭解詳情:http://msdn.microsoft.com/en-us/library/system.messaging.messagequeue.messagereadpropertyfilter.aspx

1

有時候,由於某種原因,我無法用語言形容,我們得到的消息拉從隊列消息時讀取錯誤。

您使用的是相同的例如MessageQueue從多個線程,無鎖?在這種情況下,你會在MessageReadPropertyFilter中遇到虛假的變化 - 至少我做過了,當我嘗試時。

爲什麼?Because

只有GetAllMessages方法是線程安全的。

你能做什麼?無論是

  • 環繞所有訪問鎖(_messageQueue)到你的消息隊列或
  • 創建多個MessageQueue情況下,每個線程
+0

一個這是我的答案。 +1 – SimonGoldstone 2014-08-26 11:38:50