2011-08-16 104 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'