2011-01-26 41 views
1

我在這種情況下有兩個隊列。 「錯誤」和「MyQueue」。在MSMQ中查找舊郵件

消息被轉儲到MyQueue並從那裏處理。如果它們失敗,它們將被移至錯誤隊列。 管理員可能會將消息移回MyQueue中再次處理。

我的任務是如果掃描/窺視兩個隊列來查找並計算已經循環了一個多小時的所有消息。

似乎

message.SentTime 
message.ArrivedTime 

都是無用的,因爲它們各自的消息進入隊列時間更新。

解決的方法是在郵件正文中放置一個時間戳,然而這會要求我打開所有郵件以確定郵件是否「舊」。

有沒有更好的選擇?

回答

1

問題是,它不是相同的消息循環輪流隊列。 「移動」信息通常會刪除原始信息並根據原始內容創建新信息,這就是爲什麼您無法使用發送和到達時間的原因。

移動的消息每次都有新的唯一MessageID值嗎?如果沒有,那麼也許你可以生成一個匹配MessageID到最初創建時間的表。

乾杯
約翰Breakwell

+1

感謝您輸入和解釋消息如何移動。看起來像沒有辦法完成我的使命,沒有自己做一些家務 – Rasmus 2011-01-27 20:30:39

0

您可能可以使用此類的Message類的AppSpecific屬性。不幸的是它是一個32位整數;如果時間很長,您可以將DateTime.Ticks存儲在那裏,然後使用它作爲時間戳,以計算消息的存在時間。

你可能會失去一些蜱位,以適應這樣的價值爲AppSpecific:

ticksInt = (int) DateTime.Now.Ticks >> 23; 

這給了你第二次大規模高精度,我認爲是不夠的情況......但是你可以如果你這樣做的話,不使用從Ticks轉換回來的內置DateTime或TimeSpan方法,所以你必須手動轉換,或者只是計算Now和這個值之間的差值。

+1

感謝一個很好的答案! 不幸的是,這些隊列由NServiceBus管理,因此我的代碼不是填充隊列的,而且據我所知,我不能使NServiceBus填充消息.AppSpecific帶有時間戳。 – Rasmus 2011-01-27 06:50:10