簡體   English   中英

MSMQ消息總是在同一台機器上延遲3分鍾

[英]MSMQ messages always arrive delayed by exactly 3 minutes on the same machine

我面臨着一個非常令人費解的問題。 我有一個Windows服務,它監視兩個MSMQ隊列的輸入,並將消息發送到另一個MSMQ隊列。 盡管從服務的角度來看,發送操作似乎是即時的,但它實際上只需要消息三(3)分鍾即可到達(如MSMQ MMC中的屬性窗口所示)。 我一直在測試這個問題,沒有別的東西在另一邊聽,所以我可以看到堆積的消息。 這是服務發送消息的方式:

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消息,一旦完成,它就會向MainService發送一條MSMQ消息。 同時,將消息發送到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活動退出。

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

您在隊列代碼上設置了事務,是否為事務設置了msmq對象? 3分鍾聽起來像分布式事務處理協調器登記的超時期限。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM