2013-09-16 36 views
6

我正面臨一個非常令人費解的問題。我有一個Windows服務,監視兩個MSMQ隊列的輸入並將消息發送到另一個MSMQ隊列。雖然從服務的角度來看,發送操作似乎是即時的,但實際上它只需三(3)分鐘即可到達消息(如MSMQ MMC中的屬性窗口所示)。我一直在測試這個問題,沒有別的在另一邊聽,這樣我就可以看到消息堆積起來。這是服務如何發送消息:MSMQ消息總是在同一臺機器上正好延遲3分鐘

var proxyFactory = new ChannelFactory<IOtherServerInterface>(new NetMsmqBinding(NetMsmqSecurityMode.None) 
{ 
    Durable = true, 
    TimeToLive = new TimeSpan(1, 0, 0), 
    ReceiveTimeout = TimeSpan.MaxValue 
}); 

IOtherServerInterface server = this.proxyFactory.CreateChannel(new EndpointAddress("net.msmq://localhost/private/myqueue")); 

var task = new MyTask() { ... }; 
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required)) 
{ 
    server.QueueFile(task); 
    scope.Complete(); 
} 

該服務正在Windows Server 2008 R2上運行。我也在R1上測試過它,並注意到了相同的行爲。再次,一切都發生在同一臺機器上。所有組件都部署在那裏,所以我不認爲這可能是一個網絡問題。

編輯#1:

我打開了WCF診斷和什麼我發現很奇怪。 MSMQ數據報沒有正常寫入。但是,在「消息已關閉」跟蹤消息之後,沒有任何事情發生。就好像該服務正在等待發生的事情。正好3分鐘後,MSMQ消息到達時(根據MSMQ MMC),我看到另一條有關以前活動的跟蹤消息。我懷疑有某種干擾。

讓我給你更多關於服務如何工作的細節。有一個IIS應用程序從客戶端接收任務並將其放入MSMQ隊列中。從那裏,麻煩的服務(MainService)將它們接起來並開始處理它們。在某些情況下,需要另一項服務(AuxService)來完成任務,因此MainService會將消息(始終延遲)發送到AuxService。 AuxService擁有自己的收件箱隊列,可以接收MSMQ消息,並在完成後發送MSMQ消息給MainService。與此同時,發送消息給AuxService的線程會一直等到它收到信號或超時。 MainService有一個特殊的隊列,用於查找來自AuxServices的消息。當收到消息時,上述線程被喚醒並恢復其活動。

這裏的整個架構的表示:

  • IIS應用 - > Q1 - > MainService
  • MainService - > Q2 - > AuxService
  • AuxService - > Q3 - > MainService

儘管所有操作都標有OneWay,但我想知道是否從另一個MSMQ操作中啓動MSMQ操作在某種程度上是非法的。鑑於經驗證據似乎是這種情況。如果是這樣,是否有改變這種行爲?

編輯#2:

好了,經過一些挖似乎WCF是罪魁禍首。我將MainService中的客戶端代碼和AuxService中的服務器代碼都切換爲直接使用MSMQ SDK,並且按預期工作。我所經歷的3分鐘超時實際上是MainService放棄並認爲AuxService失敗的時間。因此,WCF出於某種原因似乎拒絕執行發送,直到當前的WCF活動退出。

這是設計還是錯誤?這種行爲可以控制嗎?

+0

你使用認證?有時候,這些延遲與身份驗證相關的網絡/基礎設施問題有關。 – Groo

+0

我不使用任何身份驗證。而且,'每個人'都可以完全訪問隊列。 –

+0

對本地隊列的發送操作是即時的,因爲不需要傳出隊列。如果您使用性能監視器來跟蹤MSMQ,我希望您看到郵件發送時正在傳遞。如果不是,則可能是等待事務提交的延遲。 Easy7測試將發送到非事務性隊列並查看是否發生相同的延遲。 –

回答

1

您在隊列代碼上設置了事務處理,您是否有交易的msmq對象設置? 3分鐘聽起來像分佈式事務處理協調員入伍的超時時間。