【问题标题】:Where did my Message Queue sent messages go?我的消息队列发送的消息去了哪里?
【发布时间】:2012-10-12 16:02:10
【问题描述】:

我有一个使用 MSMQ 的应用程序,当生产者和消费者都打开时,它运行良好 同一台机器。

昨天,我第一次尝试创建另一个可以在单独的机器上运行的生产者。这 queue 是私有队列,之前双方都将其引用为

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();

    }
  }
}

【问题讨论】:

  • 邮件是否在死信队列中?
  • 我刚查了一下,死信队列里什么都没有。

标签: c# msmq


【解决方案1】:

如果您从一台服务器发送消息,然后查看出站队列,您应该会看到一个临时队列,该队列是为了传输您的消息而创建的。您应该能够在队列中看到您的消息。

现在进入接收服务器。

为了在队列上设置权限,您需要获得它的所有权。 在队列属性 -> 安全选项卡 -> 高级 -> 所有者选项卡 -> 将所有者更改为。您应该会在列表中看到您的 Windows 主体。

这将使您能够设置发送权限。完成此操作后,检查发送服务器上的出站队列,现在应该已经传输了消息。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    将以下内容添加到您的示例中。如果它没有被服务器处理,它应该出现在死信队列中。

    ...

    queue = new MessageQueue(name);
    
    queue.DefaultPropertiesToSend = new DefaultPropertiesToSend();
    
    queue.DefaultPropertiesToSend.UseDeadLetterQueue = true;
    

    ....

    【讨论】:

      【解决方案3】:

      可能是您的 msmq 服务器上的安全问题。

      尝试在队列中设置“所有人完全控制”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-20
        • 2012-03-17
        • 2016-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多