2012-02-11 91 views
0

我試圖按照以下方式創建一箇中毒消息場景。MSMQ中毒消息和TimeToReachQueue

1-在服務器(事務隊列)上創建消息隊列。 2-創建一個接收器應用程序來處理該服務器上的傳入消息。 3-創建一個位於客戶機上的客戶端應用程序,該客戶機使用隊列的特定名稱向該服務器發送消息。

4-我使用的發送方客戶端的應用程序用下面的代碼(C#4.0框架):

System.Messaging.Message mm = new System.Messaging.Message("Some msg"); 
mm.TimeToBeReceived = new TimeSpan(0, 0, 50); 
mm.TimeToReachQueue = new TimeSpan(0, 0, 30); 
mm.UseDeadLetterQueue = true; 

mq.Send(mm); 

因此,這是設置超時到達隊列爲30秒。

  • 第一次測試正常。消息已經通過,並被服務器應用程序接收。
  • 我的第二個測試,我斷開了我的以太網電纜,然後從客戶機發送另一個。

我可以在客戶端計算機上的消息隊列中看到消息正在等待發送(「等待連接」)。我的問題是,當它超過30秒(或50秒)時,消息永遠不會進入客戶機上的死信隊列中。

這是爲什麼? ......我期待着它能夠在那裏超時。

測試在Windows 7(客戶端)/ Windows Server 2008的R2(服務器)

+0

功能在Windows 7上。我剛剛使用舊測試應用程序運行測試,並在分配時間後消息從傳出隊列中消失。唯一不同的是我送到了一臺想象中的機器上,因爲我不能拉電纜。 所以它看起來像屬性沒有被正確設置。奇怪的。 – 2012-02-12 22:35:12

回答

0

你的問題了幾天之久了。你有沒有發現任何東西?

我對您的方案的解釋是,拔掉電纜是關鍵。

在John描述的情況下,存在現有連接,並且接收方無法在設定的時間限制內正確處理消息。

但是,在您的場景中,接收端點永遠不會有機會來處理消息,因此超時永遠不會發生。如你所說,消息的狀態是Waiting for connection。一條消息是從未發送過不能在邏輯上有一個超時到達其目的地

問問自己,如果隊列本質上是不活動,那麼Windows/MSMQ會不必要地犧牲多少資源並且多久檢查一次MessageQueues?系統中可能有很多隊列中有很多消息。

行爲我會期望是,如果你插網線早在和連接重新建立的話,只有在需要的時候,你的帶毒郵件時便會對超時檢查,最終移動到DeadLetter隊列。

你可能想檢查這個場景 - 或者你是否已經檢查過它?