2013-03-05 121 views
1

我有一個TCP服務器,作爲Windows羣集中的Windows服務運行。它接收消息並將它們放入隊列(MSMQ)。我製作了一個公開的MSMQ隊列。而我得到這個錯誤信息:消息隊列服務不可用

System.Messaging.MessageQueueException (0x80004005): Message Queue service is not available. 
    at System.Messaging.MessageQueue.MQCacheableInfo.get_WriteHandle() 
    at System.Messaging.MessageQueue.StaleSafeSendMessage(MQPROPS properties, IntPtr transaction) 
    at System.Messaging.MessageQueue.SendInternal(Object obj, MessageQueueTransaction internalTransaction, MessageQueueTransactionType transactionType) 

我將消息發送到隊列是這樣的:

static void SendHelper(UncookedMessage uncooked) 
{ 
    var msg = new Message(uncooked); 
    msg.Formatter = new XmlMessageFormatter(new[] { typeof(UncookedMessage) }); 

    // (PER MESSAGE) 
    msg.UseJournalQueue = false; 
    msg.AttachSenderId = false; 
    msg.Recoverable = true; 

    SingleQueue.Send(msg); 
} 

隊列的安全性給出了完全訪問的服務器和羣集定義的每個用戶。我的隊列名稱是:FormatName:DIRECT = OS:application9 \ uncooked_message_single;但我已經測試application9 \ uncooked_message_singleapplication9.domain.com \ uncooked_message_singleFORMATNAME:DIRECT = OS:application9.domain.com \ uncooked_message_single。沒有人工作。

說明:此應用程序與非羣集服務器上的專用隊列完美配合。我不太瞭解Windows羣集,但我們的管理員說這是一個故障轉移羣集,它在Windows Server 2012上。

回答

0

由於錯誤消息告訴您它不能使用請求的MSMQ服務,正確設置。

之前深入到集羣配置,我建議你...

  • ...明確檢查訪問權限的隊列羣集服務器(上不是一個單一集羣節點)。

  • ...檢查是否有防火牆阻止您的網絡中的消息。

當您在非羣集環境中成功嘗試過您的方案時,羣集環境中顯然可能存在差異。

實際上,在羣集服務器上設置MSMQ需要與非羣集服務器上的配置不同。

確保MSMQ服務和Distributed Transaction Coordinator (DTC)服務啓動並在上運行每個硬件節點

故障轉移羣集管理,建立既MSMQ和DTC服務羣集資源,然後配置MSMQ到羣集DTC被dependend作爲MSMQ -> Properties -> Dependencies一個「dependendy」右鍵。

不要忘記再次檢查您想要在羣集服務器上使用的隊列上的訪問權限。在單個節點上設置隊列不起作用。

我不知道這是否在所有情況下都是強制性的,但在我們的羣集中,我們也有一個配置爲MSMQ依賴的文件共享。據我瞭解,這應該確保MSMQ所需的臨時文件在節點切換後仍然可用。

此外,這裏有兩篇文章,我發現設置羣集節點非常有幫助。他們可能會有助於逐步確認您的配置是正確的:

+0

謝謝;問題是從集羣應用程序使用MSMQ,MSMQ服務也應該集羣化,並且也需要共享存儲,並且需要NAS。所以現在我們刪除了聚集的東西,我們使用一個手工機制來決定哪個服務器應該承擔責任。 – 2013-03-08 09:25:17

+0

@KavehShahbazian,我很高興你終於完成了。 :-) – 2013-03-08 09:47:47