我的消息队列发送的消息去哪了?

3

我有一个使用MSMQ的应用程序,当生产者和消费者在同一台机器上时,它运行得非常好。

昨天,我第一次尝试创建另一个生产者,它将在另一台机器上运行。队列是私有队列,在此之前,双方都将其作为参考。

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

我尝试了几种方法来从远程机器引用这个队列。我的服务器名称是"groucho",因此我尝试了以下方式:

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

但是这一直抛出“无效的队列路径名”异常。

一位开发者建议我尝试以下方法来避免异常:

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

这不再抛出异常,但似乎也不能工作,因为我在队列中看不到消息。
服务器是 Windows Server 2008 R2。队列被设置(我刚注意到)为“每个人”都可以接收和查看,但不能发送,但当我尝试添加“发送”时,会弹出一个错误对话框,显示“无法设置安全描述符,错误:拒绝访问”。我确实拥有此计算机上的管理员权限。
我从阅读其他帖子中了解到,有各种安全性问题需要考虑,但我在发件人或主机计算机的事件日志中没有看到任何错误信息。
如果这是安全问题,我该如何查看问题所在?
谢谢!
以下是完整的测试代码:
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();

    }
  }
}

死信队列中是否有消息? - Derek Beattie
我刚刚检查了一下,死信队列里没有任何东西。 - Mitchell McConnell
3个回答

4
如果您从一个服务器发送消息,然后查看您的出站队列,您应该会看到一个临时队列,该队列旨在传输您的消息。您应该能够在队列上看到您的消息。
现在进入接收服务器。
为了在队列上设置权限,您需要拥有它。在队列属性->安全选项卡->高级->所有者选项卡->更改所有者中,您应该在列表中看到您的Windows主体。
这将使您能够设置发送权限。完成此操作后,请检查发送服务器上的出站队列,消息现在应已传输。
希望这可以帮助您。

1
请将以下内容添加到您的示例中。如果服务器未处理它,则应出现在死信队列中。

...

queue = new MessageQueue(name);

queue.DefaultPropertiesToSend = new DefaultPropertiesToSend();

queue.DefaultPropertiesToSend.UseDeadLetterQueue = true;

....


0

可能是您的 MSMQ 服务器存在安全问题。

尝试在队列上设置“每个人拥有完全控制”权限。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接