2011-08-16 102 views
3

我有一個應用程序使用MSMQ,當生產者和消費者都在 同一臺機器上工作得很好。我的消息隊列發送消息去了哪裏?

昨天,我第一次試圖創建另一個生產者,可以在另一臺機器上運行。該 隊列專用隊列,而之前,雙方都引用它作爲

string strQueueName = ".\Private$\MyQueue"; 

我嘗試了幾種方法來從遠程計算機引用此隊列。我的服務器名稱爲「格勞喬」, 所以我試圖

string strQueueName = "groucho\Private$\MyQueue"; 

但這始終拋出一個「無效的隊列路徑名」異常。

一位同行開發商建議我嘗試以下方法,避免了異常:

string strQueueName = "FORMATNAME:DIRECT =OS:grouch\\private$\\SDVQueue"; 

此不再拋出異常,但它似乎沒有工作,要麼,因爲我不 看到消息在隊列中。

服務器是Windows Server 2008 R2。隊列設置(我剛剛注意到),以便 「Everyone」可以接收和查看,但不發送,但是當我嘗試添加「發送」時,出現錯誤對話框 「無法設置安全描述符,錯誤:訪問被拒絕「。 I 在此框上具有管理員權限。

我從閱讀其他帖子就知道存在各種安全性, 但我在發件人或主機上的事件日誌中都看不到任何錯誤。

如果這是一個安全問題,我怎麼能看到問題是什麼?

謝謝!

下面是完整的測試代碼:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.Messaging; 

namespace RemoteQueue 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     string name = "FORMATNAME:DIRECT =OS:groucho\\private$\\SDVQueue";; 
     string input = null; 
     MessageQueue queue = null; 

     try 
     { 
     queue = new MessageQueue(name); 
     string key = "key"; 

     for (int i = 0; i < 200; i++) 
     { 
      Message msgToSend = new Message(); 
      string value = "value_" + i; 

      msgToSend.Body = string.Format("{0},{1}", key, value); 

      Console.WriteLine("Sending message " + i); 
      queue.Send(msgToSend, "otherpart"); 
     } 

     } 
     catch (MessageQueueException me) 
     { 
     Console.WriteLine("ERROR: caught message queue exception: " + me.Message); 
     } 

     Console.WriteLine("Type any key to exit..."); 
     input = Console.ReadLine(); 

    } 
    } 
} 
+0

消息是否在死信隊列中? –

+0

我剛剛檢查過,死信隊列中沒有任何內容。 –

回答

4

如果你從一臺服務器發送消息,然後看看你的出站隊列,你應該可以看到已經與傳送的意圖創建一個臨時隊列您信息。您應該能夠在隊列中看到您的消息。

現在進入接收服務器。

爲了在隊列上設置權限,您需要掌握它的所有權。 在隊列屬性 - >安全選項卡 - >高級 - >所有者選項卡 - >將所有者更改爲。你應該在列表中看到你的Windows主體。

這將使您能夠設置發送權限。完成此操作後,請檢查發送服務器上的出站隊列,並且現在應該發送消息。

希望這會有所幫助。

1

將以下內容添加到您的示例中。它應該顯示在死信隊列中,如果它沒有被服務器處理。

...

queue = new MessageQueue(name); 

queue.DefaultPropertiesToSend = new DefaultPropertiesToSend(); 

queue.DefaultPropertiesToSend.UseDeadLetterQueue = true; 

....

0

可能是您的MSMQ服務器上的安全問題。

嘗試設置隊列上的'everyone full control'